java - 子类中的最终字段初始化

标签 java initialization

奇怪,但我找不到这个问题的重复项。 我有一个带有 overrideMe() 方法的父类(super class)和一个覆盖它的子类。 Final字段真的在调用子类构造函数之前初始化了吗? 正如我从输出中看到的那样,确实如此。

这是输出: 父类(super class)构造 str 值:someValue 子类构造 str值:someValue

你能给我解释一下吗? 我认为实例变量是在构造函数调用内初始化的,而不是在调用之前初始化的。

代码如下:

public class Test {
  public Test() {
    System.out.println("Superclass constr");
    overrideMe();
  }

  public void overrideMe() {
  }
}

class Ext extends Test {
  private final String str = "someValue";

  public Ext() {
    System.out.println("Subclass constr");
  }

  @Override
  public void overrideMe() {
    System.out.println("str value: " + str);
  }

  public static void main(String[] args) {
    Ext test = new Ext();
    test.overrideMe();
  }
}

编辑: 如果我将 str 字段声明为非最终字段,则构造函数中对它的子类调用将按我的预期返回 null。

最佳答案

是的,字段在调用构造函数之前初始化,并且从重载类之前的上层类开始。

以下是一般介绍:http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ306_014.htm

关于java - 子类中的最终字段初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11079968/

相关文章:

c++ - 初始化嵌套结构数组

c++ - 成员初始化列表符号 : curly braces vs parentheses

c++ - 静态初始化 C++,未设置值

java - 如何使用仅使用单词而不使用数字的二分搜索?

java - 从 java 建立连接时,我们是否需要在 VM TrustStore 中添加经过验证的 CA?

java - Gradle 是否应该从 mavenLocal() 为每个项目制作 JAR-s 的本地副本?

java - 如何初始化一个字符串?

java - "%%"在Java中是什么意思?

c# - 将 java 字节转换为 c# 字节(序列化问题)

c++ - 为什么值初始化如此命名?