【问题标题】:Java - initializing instant member through a final method [duplicate]Java - 通过最终方法初始化即时成员[重复]
【发布时间】:2014-06-19 23:00:32
【问题描述】:

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

【问题讨论】:

  • 如果您问过“final 在方法上有什么不同?”,您可能正在寻找答案。它与继承有关。
  • 添加到我的评论中,请查看stackoverflow.com/q/7477553/2231632 了解为什么会这样。

标签: java methods initialization member final


【解决方案1】:

根据你当前的程序,第一件事,使用或不使用它都没有影响。

因为在我们进行继承时会出现final关键字。

现在假设我们已经将上面的类继承给了其他类,比如 AAA。

案例 1:如果您没有最终方法。 那么所有非最终方法都可以在子类中被覆盖,因此有 通过覆盖子类的方法修改变量值的机会。

注意:这里基类变量的值可以在子类中修改 知道它到基类。

案例 2:如果您在方法上有 final 关键字。

那么子类中的方法不能被overrdien,否则会出现编译错误。

因此它不能改变你的基类变量值。

注意:如果以后不想修改这些东西,应该使用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);

【讨论】:

    猜你喜欢
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多