【问题标题】:Order of initialization/instantiation of class variables of derived class and invoking of base class constructor派生类的类变量的初始化/实例化顺序和基类构造函数的调用
【发布时间】:2015-09-09 23:30:34
【问题描述】:

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

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 被初始化。这个顺序正确吗?

【问题讨论】:

  • 基类总是首先被实例化,然后是初始化器,然后是构造器。请注意,您的两个 y 字段不是同一个字段,因此第一次调用 function 打印 0(derived.y 尚未初始化),第二次调用打印 3。
  • 那么,是不是在 B 中的 y 初始化为 3 之前调用了基类构造函数?
  • 但是在您的评论中写了“然后是初始化程序,然后是构造函数”。这不意味着 b 中的 y 首先被初始化吗?我在这里弄糊涂了,请 calrify
  • 基类首先base初始化器,然后base构造器),然后子类(derived初始化器,然后derived构造函数)。
  • 不知道你在问什么,因为到目前为止的整个讨论都是关于对象实例化的。

标签: java inheritance constructor initialization instantiation


【解决方案1】:

执行顺序如下:

1) 静态初始化器

[基类实例化]

2) 实例初始化器

3) 构造函数

4) 主要的剩余部分。

静态初始化在基类实例化之前。

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


您的代码

您没有任何实例块。

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

但是derived.y变量还没有初始化,所以y的值默认为0。

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

注意:两个y变量不相同。

【讨论】:

  • @Pavan_k_k 您是否完全理解或者您希望我更详细地解释任何部分?
猜你喜欢
  • 1970-01-01
  • 2011-09-09
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 2012-05-19
相关资源
最近更新 更多