【问题标题】:static() method (without any decleration)static() 方法(没有任何声明)
【发布时间】:2011-12-20 22:48:43
【问题描述】:
我有以下课程:
public abstract class A()
{
public static final SomeString = null;
static()
{
SomeString = "aaa";
}
}
什么时候调用这个静态方法,如何调用?
创建这样一个静态方法(没有名称/返回类型)的目的是什么?
【问题讨论】:
标签:
java
static
initializer
static-initialization
【解决方案1】:
那不是方法,是静态初始化块,你的语法错误
public abstract class A()
{
public static String SomeString = null;
static
{
SomeString = "aaa";
}
}
在声明时在 Java 中初始化字段(静态或实例)的最简单方法是提供兼容数据类型的编译时常量值。例如:
public class InitializationWithConstants{
public static int staticIntField = 100;
private boolean instanceBoolField = true;
}
这种类型的初始化由于其简单性而有其局限性,即使基于一些中等复杂的逻辑,它也不支持初始化 - 例如使用 for 循环中的某些逻辑仅初始化复杂数组的选定元素。
这里需要静态初始化块和初始化块来分别初始化静态和实例字段。
这是一个普通的代码块,包含在一对大括号中,前面有一个“静态”关键字。这些块可以位于类定义中我们可以拥有字段或方法的任何位置。 Java 运行时保证所有静态初始化块都按照它们在源代码中出现的顺序被调用,这发生在将类加载到内存中时。
public class InitializationWithStaticInitBlock{
public static int staticIntField;
private boolean instanceBoolField = true;
static{
//compute the value of an int variable 'x'
staticIntField = x;
}
}
由于静态初始化块实际上是代码块,因此它们将允许我们初始化那些需要进行一些逻辑处理才能获得初始值的静态字段。
【解决方案2】:
你的语法不正确;应该是:
public abstract class A()
{
public static final String SomeString;
static
{
SomeString = "aaa";
}
}
static 块允许在加载类时初始化静态变量,而该初始化比简单的 = something; 更复杂。
Reference
【解决方案3】:
抛开语法不谈,您正在查看一个静态初始化程序块。他们被提及here。
本质上,静态初始化块是在加载类时执行的一段代码,可用于初始化类中的静态字段。
例子:
public abstract class A
{
public static final String SomeString;
static
{
System.out.println("static{}");
SomeString = "aaa";
}
public static void main(String[]args)
{
System.out.println("main");
}
}
输出:
static{}
main
【解决方案4】:
是的,这不是一种方法。它是静态块,在加载所有者类时我会评估一次。
你可以用它来动态初始化静态变量...