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