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对一种方法有什么不同?”你可能正在找到答案的路上。这与继承有关。除了我的评论之外,请检查以了解为什么会这样。