Java 新关键字是否不可执行?

Java 新关键字是否不可执行?,java,Java,在java中,为什么在类的顶端我们可以像这样初始化内存 public Class blahh{ private String s = new String("Hi"); public static void main(String args[]){} } 为什么这是合法的,不是新关键字的可执行代码 如果我替换了私有字符串s。。。。而是使用方法调用。它会被执行吗?这里有一个字段声明器。它可能包括一个初始值设定项,它是分配给字段的值。这是一种在构造函数中进行赋值的简写 现在,这种初始值设定项在

在java中,为什么在类的顶端我们可以像这样初始化内存

public Class blahh{

private String s = new String("Hi");

public static void main(String args[]){}
}
为什么这是合法的,不是新关键字的可执行代码

如果我替换了私有字符串s。。。。而是使用方法调用。它会被执行吗?

这里有一个字段声明器。它可能包括一个初始值设定项,它是分配给字段的值。这是一种在构造函数中进行赋值的简写

现在,这种初始值设定项在您看来可能很自然:

private int myInt = 3;
但事实上,初始值设定项可以是任何类型的表达式:

private int myInt = 9 / 3;
这里你已经计算过了。这是执行的代码(好吧,它可能会被优化掉,但在理论上,即使您没有任何优化器,这也可以工作)。它将9除以3,并将结果分配给
myInt

这实际上告诉编译器的是,当这个类的一个新实例被创建时,它应该在继续构造函数的主体之前执行这个计算,并将值赋给字段

因此,通常任何允许在构造函数中执行的代码,只要可以用一个表达式表示,都可以分配给变量。下面是一个小程序:

public class SimpleTest {

    // Yes, you can call a method as a field initialization!
    private int myInt = myMethod();

    // The method performs a calculation end returns a value.
    private int myMethod() {
        return (int)Math.sqrt(9.0);
    }

    // Getter for the field
    public int getMyInt() {
        return myInt;
    }

    public static void main(String[] args) {            
        SimpleTest test = new SimpleTest();
        System.out.println( test.getMyInt());
    }

}

该程序向您展示了可以在字段声明器中使用方法。程序将打印“3”。

是的,只要实例化类,构造函数就会运行。如果声明是
静态的
,则每当类加载到内存中时,它就会运行。@Kon:每当类加载到内存中时。还是只有一次?继承类和非继承类呢?它们是分开加载的吗?对于
static
,只加载一次。blahh会自动从Object继承一个默认构造函数。因此,您可以在与声明相同的位置进行方法调用吗?