java - 相对于父类(super class)构造函数的最终可变初始化

标签 java initialization final superclass

正如这篇 (Initialize field before super constructor runs?) 文章所述,所有非静态变量都在父类(super class)构造函数运行后初始化,但在下面的示例中,在调试时我看到变量在父构造函数运行之前未初始化, print 函数打印结果“B=5”,就好像它已被初始化一样。

当我使用非最终变量时,结果如预期的那样是“B=0”。

这是怎么回事?

代码如下:

public class A {
    int a=77;
    public A(int i){
        printMe();
    }

    public void printMe(){
        System.out.println("A "+a);
    }
}

public class B extends A{
    //static int a=5; //test  will print 5
    final int a=5; //test  will print 5
    //int a=5;         ////test will print 0
    public B() {
        super(0);
    }

    public void printMe(){
        System.out.println("B="+a);
    }

    public static void main(String[] args) {
        new B();
    }
}

最佳答案

这个

final int a=5;

是常量变量,也就是常量表达式。编译器将用它的值替换对它的所有引用。

所以

System.out.println("B="+a);

实际上会编译成

System.out.println("B="+5); // B=5

关于java - 相对于父类(super class)构造函数的最终可变初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24579456/

相关文章:

c++ - 使用公共(public)数据初始化多个 C++ 数组

java - 最终数据成员给出不同的值(非静态数据成员)

java - 使用 Java 从 .sql 文件中提取 SQL 命令

java - JPA 中的 SQL 查询

c++ - 数组初始化 - 有条件地

python - 类变量在赋值时失去作用域

java - 在 Java SwingWorker 方法的签名中使用最终变量

java - 字段的默认值是否保证在线程中可见?

Java写入关闭的输出流不抛出ioexception

java - 使用 TSL 通过 SMTP 发送电子邮件