关于java:使用方法分配final关键字

assigning final keyword using a methofd

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 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);

    }

以下代码的输出如下

1
2
3
Inside Method
Inside Constructor
1

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

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


它与final关键字无关。尝试以下(刚刚删除final输出将相同。基本上,先初始化实例变量,然后调用构造函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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);
    }
}

现在,为什么以及如何在构造函数之前初始化实例变量,看看为什么在调用构造函数之前初始化实例变量?


如果将构造函数更改为

1
2
3
4
Test(){
    super();
    System.out.println("Inside Constructor");
}

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

你也可以写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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);

    }
}


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

init(1);是一种方法,只要类正在构造一个实例…

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