java - 派生类的类变量的初始化/实例化和调用基类构造函数的顺序

标签 java inheritance constructor initialization instantiation

我想弄清楚 1) 派生类变量的初始化/实例化 2) 在此代码片段中调用基类构造函数的顺序

public class base 
{
  int y = 1;
  public base()
  { 
      y = 2; 
      function();
  }
  void function () 
  {
     System.out.println("In base Value = " + String.valueOf(y));
  }

  public static class derived extends base 
  {
      int y = 3;
      public derived()
      { 
          function();
      }
      void function () 
      {
          System.out.println("In derived Value = " + String.valueOf(y));
      }
  }
  public static void main(String[] args) 
  { 
      base b = new base.derived();
      return;
  }
}

我的理解是首先实例化派生类,然后调用基类构造函数,然后初始化派生类变量y。这个顺序正确吗?

最佳答案

执行顺序如下:

1) 静态初始化器

[基类实例化]

2) 实例初始化器

3)构造函数

4) 主体的剩余部分。

静态初始化器先于基类实例化。

如果您有超过 1 个实例初始化器,它们会按照从上到下写入的顺序出现。


你的代码

您没有任何实例 block 。

先运行父类构造函数,将基类中的y变量with设置为2,然后调用function方法,但是子类中function方法已经被覆盖,所以使用子类方法。

但是 derived.y 变量尚未初始化,因此 y 的值默认为 0。

在那之后,子类; derived 的构造函数然后运行,derived.y 的值声明为 3,派生类中定义的覆盖函数方法运行,因此打印派生值为 3。

注意:两个y变量不一样

关于java - 派生类的类变量的初始化/实例化和调用基类构造函数的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32490714/

相关文章:

c# - 在构造函数中调用异步方法?

java - 聚合根与复合根有何不同?

java - 使用纯Java通过JMeter执行JMS压力测试

python - 覆盖类属性但不覆盖子类中的方法

java - Java 中的继承和转换

C++ - 在另一个类中实例化对象时调用默认构造函数以外的构造函数

java - 此 KnockKnockProtocol 类的构造函数代码中的 Java bug 在哪里?

java - 在 Java 中如何舍入到最接近的 20 的倍数?

java - 将 xml 输入流式传输到 sax 解析器,如何打印流式传输的 xml?

ruby - 包含模块时使用间接有优势吗(来自 7 周内的 7 种语言,Ruby 第 3 天)