创建子类的实例是否会自动创建其超类对象?

Mru*_*kur 11 java inheritance

如果我创建一个子类的对象,那么还将创建从继承子类的超类对象吗?如果没有,那么如何通过创建Thread类的子类(在多线程中)调用Thread类构造函数并创建一个Thread对象?

Jon*_*eet 12

子类的实例超类的一个实例.只创建了一个对象,但作为该创建的一部分,构造函数调用一直链接在一起java.lang.Object.例如:

public class Superclass {

    // Note: I wouldn't normally use public variables.
    // It's just for the sake of the example.
    public int superclassField = 10;

    public Superclass() {
        System.out.println("Superclass constructor");
    }
}

public class Subclass extends Superclass {

    public int subclassField = 20;

    public Subclass() {
        super(); // Implicit if you leave it out. Chains to superclass constructor
        System.out.println("Subclass constructor");
    }
}

...

Subclass x = new Subclass();
System.out.println(x instanceof Subclass);
System.out.println(x instanceof Superclass);
System.out.println(x.superclassField);
System.out.println(x.subclassField);
Run Code Online (Sandbox Code Playgroud)

这个输出是:

Superclass constructor
Subclass constructor
true
true
10
20
Run Code Online (Sandbox Code Playgroud)

......因为:

  • 任何构造函数做的第一件事是调用同一个类中的另一个构造函数,或者调用超类构造函数.所以我们在输出中的"Subclass constructor"之前看到"Superclass constructor".
  • 我们创建的对象(显然)是一个实例 Subclass
  • 我们创建的对象也是一个实例Superclass
  • 我们创建的单个对象包含两个字段(superclassFieldsubclassField).即使字段是私有的(通常也是这样),情况也是如此 - 代码中的代码Subclass将无法访问声明的私有字段Superclass,但字段仍然存在 - 并且仍然可以访问其中的代码Superclass.

事实上,我们有一个具有所有状态(包括超类和子类)的单个对象以及所有行为(在其中声明的任何方法Superclass仍然可以在实例上使用Subclass,尽管有些可能更多的特殊行为覆盖)是至关重要的了解Java的多态性方法.


小智 2

当您创建另一个对象的子类时,您只是创建了一个对象。它是子类及其所有父类的实例。例如,我创建了一个猫对象。它是一只猫,同时也是一种猫科动物、哺乳动物、动物和物体。