Java—通过final方法初始化即时成员
我使用以下代码通过最终方法初始化实例变量:Java—通过final方法初始化即时成员,java,methods,initialization,member,final,Java,Methods,Initialization,Member,Final,我使用以下代码通过最终方法初始化实例变量: public class Whatever { private int myVar = initializeInstanceVariable(); protected final int initializeInstanceVariable() { return 10; } public static void main(String[] args) { Whatever myVar2
public class Whatever {
private int myVar = initializeInstanceVariable();
protected final int initializeInstanceVariable() {
return 10;
}
public static void main(String[] args) {
Whatever myVar2 = new Whatever();
myVar2.initializeInstanceVariable();
System.out.println(myVar2.myVar);
}
}
根据本教程:
该方法是final的,因为在实例初始化期间调用非final方法可能会导致问题
我的问题是:如果没有final关键字,该方法会导致什么问题?我已经运行了带final关键字和不带final关键字的代码,结果是一样的,没有任何编译错误。根据您当前的程序,第一件事是,使用final或不使用final都没有影响 因为当我们进行继承时,最后一个关键字出现在图片中 现在假设我们已经将上面的类继承给了其他类,比如AAA 案例1:如果你没有最终的方法。 然后,所有非final方法都可以在子类中重写,因此 通过Overderen子类的方法修改变量值的机会 注意:在这里,基类变量的值可以在子类中修改,而无需修改 知道它是基类的 案例2:如果你有一个方法的final关键字 那个么方法在子类中就不能被覆盖,若你们这样做,你们将得到编译时错误 因此它不能改变基类变量的值 注意:如果将来您不想修改内容,则应使用final 请参阅下面的程序,它如何影响没有最终关键字
package com.kb;
public class Whatever {
private int myVar = initializeInstanceVariable();
protected int initializeInstanceVariable() {
return 10;
}
public static void main(String[] args) {
Whatever myVar2 = new Whatever();
myVar2.initializeInstanceVariable();
System.out.println(myVar2.myVar);
Whatever var = new AAA();
System.out.println(var.myVar);
}
}
class AAA extends Whatever{
@Override
protected int initializeInstanceVariable() {
return 20;
}
}
还有一件事,您不必调用方法myVar2.initializeInstanceVariable;同样,在您的场景中
因为您在初始化变量时调用了一个方法
所以,当您访问变量时,只会得到初始化值
意味着方法将被自动调用,您将获得值
所以,若我们也对方法调用进行注释,下面的行也将起同样的作用
Whatever myVar2 = new Whatever();
// myVar2.initializeInstanceVariable();
System.out.println(myVar2.myVar);
如果你问“final对一种方法有什么不同?”你可能正在找到答案的路上。这与继承有关。除了我的评论之外,请检查以了解为什么会这样。