当子类没有在Java中定义构造函数时会发生什么?

Cla*_*diu 10 java oop generics

我有几个我想知道的案例.首先,如果你没有构造函数:

class NoCons { int x; }
Run Code Online (Sandbox Code Playgroud)

当我这样做时new NoCons(),默认构造函数被调用.它究竟做了什么?它是设置x为0,还是在其他地方发生?

如果我遇到这种情况怎么办:

class NoCons2 extends NoCons { int y; }
Run Code Online (Sandbox Code Playgroud)

我打电话后会发生什么new NoCons2()?是否NoCons默认构造函数被调用,然后NoCons2是构造函数?他们各自将各自xy字段设置为0吗?

这个版本怎么样:

class Cons2 extends NoCons { int y; public Cons2() {} }
Run Code Online (Sandbox Code Playgroud)

现在我有一个构造函数,但它不会调用超类的构造函数.如何x初始化?如果我有这种情况怎么办?

class Cons { int x; public Cons() {} }
class NoCons2 extends Cons { int y;  }
Run Code Online (Sandbox Code Playgroud)

是否会Cons调用构造函数?

我可以尝试所有这些示例,但我无法确定何时运行默认构造函数.考虑这一点的一般方法是什么,以便我知道未来情况会发生什么?

cle*_*tus 13

当Java类没有显式定义构造函数时,会添加一个公共的no-args默认构造函数,因此:

class Cons { int x; } 
Run Code Online (Sandbox Code Playgroud)

相当于:

class Cons { int x; public Cons() {} }
Run Code Online (Sandbox Code Playgroud)

子类的构造函数没有显式定义它调用的父构造函数中的哪一个将它执行任何其他操作之前自动调用父类中的默认构造函数.所以假设:

class A { public A() { System.out.println("A"); } }
Run Code Online (Sandbox Code Playgroud)

这个:

class B extends A { public B() { System.out.println("B"); } }
Run Code Online (Sandbox Code Playgroud)

完全等同于:

class B extends A { public B() { super(); System.out.println("B"); } }
Run Code Online (Sandbox Code Playgroud)

两种情况下的输出都是:

A
B
Run Code Online (Sandbox Code Playgroud)

所以当你这样做时:

new NoCons2();
Run Code Online (Sandbox Code Playgroud)

订单是:

  1. NoCons的默认构造函数被调用,虽然这在技术上是(2)的第一部分; 然后
  2. NoCons2的默认构造函数被调用.