Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 派生类的类变量的初始化/实例化顺序以及基类构造函数的调用顺序_Java_Inheritance_Constructor_Initialization_Instantiation - Fatal编程技术网

Java 派生类的类变量的初始化/实例化顺序以及基类构造函数的调用顺序

Java 派生类的类变量的初始化/实例化顺序以及基类构造函数的调用顺序,java,inheritance,constructor,initialization,instantiation,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 deri

我想弄清楚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) 主体的其余部分

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

如果您有多个实例初始化器,则它们的出现顺序是从上到下写入的


你的代码 您没有任何实例块

父类构造函数首先运行,基类中的y变量with设置为2,然后调用函数方法,但是函数方法在子类中被重写,因此使用子类方法

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

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


注意:两个y变量不一样。

基类总是先实例化,然后初始化,然后是构造函数。请注意,您的两个
y
字段不是同一个字段,因此对
函数的第一次调用
打印0(派生的.y尚未初始化),第二次调用打印3。那么,在B中的y初始化为3之前是否调用了基类构造函数?但是在您的注释中写入了“然后是初始化者,然后是构造函数”。这不意味着b中的y首先被初始化吗?我在这里感到困惑,请首先计算基础类(
base
initializers,然后
base
constructor),然后是子类(
derived
initializers,然后
derived
constructor).不知道你在问什么,因为到目前为止整个讨论都是关于对象实例化的。@Pavan_____________________________________?