Java - 通过最终方法初始化即时成员

时间:2014-05-03 08:33:30

标签: java methods initialization member final

我正在使用以下代码通过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关键字运行代码,结果相同,没有任何编译错误。

1 个答案:

答案 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);