使用methofd

时间:2016-09-11 08:31:36

标签: java 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

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

我无法找到的是如何在构造函数之前调用方法,我真的很感激为此做出任何解释

3 个答案:

答案 0 :(得分:3)

它与final关键字无关。尝试下面(刚刚删除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?

答案 1 :(得分: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);

    }
}

答案 2 :(得分:1)

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

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

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