【问题标题】:assigning final keyword using a methofd [duplicate]使用方法分配最终关键字[重复]
【发布时间】:2017-01-18 22:38:23
【问题描述】:

我只是在玩 final 关键字并观察到以下行为,这里我使用一个方法分配一个最终变量,并且该方法在构造函数之前被调用

 public class Test {

    final int i=init(1);

    Test(){
        System.out.println("Inside Constructor");
    }

    public int init(int i){
        System.out.println("Inside Method");
        return i;
    }

    public static void main(String [] args){
        Test i=new Test();
        System.out.println(i.i);

    }

以下代码的输出如下

Inside Method
Inside Constructor
1

我知道在构造函数完成之前需要分配最终变量,这就是这里发生的事情

我找不到的是如何在构造函数之前调用方法,我非常感谢对此的任何解释

【问题讨论】:

标签: java final


【解决方案1】:

finalkeyword 无关。试试下面(刚刚删除 final )输出将是相同的。基本上实例变量将首先被初始化然后构造函数被调用

public class Test {
     int i = init(1);

    Test() {
        System.out.println("Inside Constructor");
    }

    public int init(int i) {
        System.out.println("Inside Method");
        return i;
    }

    public static void main(String[] args) {
        System.out.println("start");
        Test i = new Test();
        System.out.println(i.i);
    }
}

现在为什么以及如何在构造函数之前初始化实例变量参见Why instance variables get initialized before constructor called?

【讨论】:

  • 是的,我知道这将在没有 final 的情况下工作,我的错误是我在问题中提出了问题,并且从给定的链接中我得到编译器将每个初始化都移动到每个构造函数,但在这里因为它是一个方法这意味着在构造结束之前调用方法,到目前为止我所知道的是我必须使用一个对象来使用方法
  • 是的,可以在构造结束之前调用方法。是的,如果你不小心,这可能会导致古怪的行为。
  • 我发现只有在调用超级构造函数完成后才能从构造函数调用实例方法
【解决方案2】:

如果您将构造函数更改为

Test(){
    super();
    System.out.println("Inside Constructor");
}

并将调试点设置为super();,您将看到构造函数在init(1); 之前被调用。它只是在您的 System.out.println("Inside Constructor"); 之前被调用。

你也可以写:

public class Test {
    final int i;

    Test(){
        super();
        i = init(1);
        System.out.println("Inside Constructor");
    }

    public int init(int i){
        System.out.println("Inside Method");
        return i;
    }

    public static void main(String [] args){
        Test i=new Test();
        System.out.println(i.i);

    }
}

【讨论】:

    【解决方案3】:

    代码中的这种行为是正确的,与你对最终关键词的分析无关……

    init(1); 是一个在类构造实例时立即被调用的方法...

    因此,方法内部的所有内容都将在构造函数之前执行...

    【讨论】:

    • init(1) 不会在类加载后立即调用,而是在创建对象时调用
    猜你喜欢
    • 2011-11-26
    • 2014-02-01
    • 2021-10-08
    • 2013-05-05
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    相关资源
    最近更新 更多