我正在使用以下代码通过final方法初始化实例变量:
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);
}
}
根据本教程:
http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html
"该方法是最终的,因为在实例初始化期间调用非最终方法可能会导致问题。"
我的问题是:如果没有final关键字,该方法会出现什么问题?我使用和不使用final关键字运行代码,结果相同,没有任何编译错误。
答案 0 :(得分:0)
首先根据您当前的计划,不影响使用最终版本或不使用它。
因为当我们进行继承时,最终关键字会出现。
现在假设我们已将上面的类继承到其他类,比如AAA。
案例1:如果您没有最终方法。 那么所有非最终方法都可以在子类中被覆盖,因此存在 有可能通过超越子类的方法来修改变量值。
注意:这里可以在没有子类的情况下修改基类变量的值 知道它是基类。
案例2:如果您在某个方法上拥有最终关键字。
那么方法不能在子类中过度使用,如果这样做会导致编译时错误。
因此它不能改变你的基类变量值。
注意:如果将来你不想修改那些东西,应该使用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);