使用方法分配 final 关键字
assigning final keyword using a methofd
我只是在玩 final 关键字并观察到以下行为,这里我使用方法分配一个 final 变量,并且该方法在构造函数之前被调用
public class Test {
final int i=init(1);
Test(){
System.out.println("Inside Constructor");
}
public int init(int i){
System.out.println("Inside Method");
return i;
}
public static void main(String [] args){
Test i=new Test();
System.out.println(i.i);
}
下面代码的输出结果如下
Inside Method
Inside Constructor
1
我知道在构造函数完成之前需要分配 final 变量,这就是这里发生的事情
我无法找到的是如何在构造函数之前调用方法,我非常感谢对此的任何解释
代码中的这种行为是正确的,与您对最终关键字的分析无关...
init(1);
是一种方法,一旦 class 正在构造一个实例就会被调用...
因此,方法内部的所有内容甚至会在构造函数之前执行...
如果您将构造函数更改为
Test(){
super();
System.out.println("Inside Constructor");
}
并将调试点设置为 super();
您将看到构造函数在 init(1);
之前被调用。它只是在您的 System.out.println("Inside Constructor");
.
之前被调用
你也可以这样写:
public class Test {
final int i;
Test(){
super();
i = init(1);
System.out.println("Inside Constructor");
}
public int init(int i){
System.out.println("Inside Method");
return i;
}
public static void main(String [] args){
Test i=new Test();
System.out.println(i.i);
}
}
与final
关键字无关。尝试下面(刚刚删除 final
)输出将相同。基本上实例变量将首先被初始化然后构造函数被调用
public class Test {
int i = init(1);
Test() {
System.out.println("Inside Constructor");
}
public int init(int i) {
System.out.println("Inside Method");
return i;
}
public static void main(String[] args) {
System.out.println("start");
Test i = new Test();
System.out.println(i.i);
}
}
现在为什么以及如何在构造函数之前初始化实例变量参见Why instance variables get initialized before constructor called?
我只是在玩 final 关键字并观察到以下行为,这里我使用方法分配一个 final 变量,并且该方法在构造函数之前被调用
public class Test {
final int i=init(1);
Test(){
System.out.println("Inside Constructor");
}
public int init(int i){
System.out.println("Inside Method");
return i;
}
public static void main(String [] args){
Test i=new Test();
System.out.println(i.i);
}
下面代码的输出结果如下
Inside Method
Inside Constructor
1
我知道在构造函数完成之前需要分配 final 变量,这就是这里发生的事情
我无法找到的是如何在构造函数之前调用方法,我非常感谢对此的任何解释
代码中的这种行为是正确的,与您对最终关键字的分析无关...
init(1);
是一种方法,一旦 class 正在构造一个实例就会被调用...
因此,方法内部的所有内容甚至会在构造函数之前执行...
如果您将构造函数更改为
Test(){
super();
System.out.println("Inside Constructor");
}
并将调试点设置为 super();
您将看到构造函数在 init(1);
之前被调用。它只是在您的 System.out.println("Inside Constructor");
.
你也可以这样写:
public class Test {
final int i;
Test(){
super();
i = init(1);
System.out.println("Inside Constructor");
}
public int init(int i){
System.out.println("Inside Method");
return i;
}
public static void main(String [] args){
Test i=new Test();
System.out.println(i.i);
}
}
与final
关键字无关。尝试下面(刚刚删除 final
)输出将相同。基本上实例变量将首先被初始化然后构造函数被调用
public class Test {
int i = init(1);
Test() {
System.out.println("Inside Constructor");
}
public int init(int i) {
System.out.println("Inside Method");
return i;
}
public static void main(String[] args) {
System.out.println("start");
Test i = new Test();
System.out.println(i.i);
}
}
现在为什么以及如何在构造函数之前初始化实例变量参见Why instance variables get initialized before constructor called?