java - 创建子类的实例是否会自动创建其父类(super class)对象?

标签 java inheritance

如果我创建一个子类的对象,那么是否也会创建子类继承的父类(super class)对象?如果不是那么如何通过创建 Thread 类的子类(在多线程中)调用 Thread 类构造函数并创建 Thread 对象?

最佳答案

子类的实例父类(super class)的实例。只创建了一个对象,但作为该创建的一部分,构造函数调用一直链接在一起,一直到 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);

这个的输出是:

Superclass constructor
Subclass constructor
true
true
10
20

...因为:

  • 任何构造函数做的第一件事就是调用同一个类中的另一个构造函数,或者调用父类(super class)构造函数。所以我们在输出中的“子类构造函数”之前看到“父类(super class)构造函数”。
  • 我们创建的对象(显然)是 Subclass
  • 的一个实例
  • 我们创建的对象也是 Superclass
  • 的一个实例
  • 我们创建的单个对象具有两个 字段(superclassFieldsubclassField)。即使字段是私有(private)的(它们通常是私有(private)的)也是如此 - Subclass 中的代码将无法访问 中声明的私有(private)字段>Superclass,但该字段仍然存在 - 并且仍然可以访问 Superclass 中的代码。

事实是我们有一个对象,所有状态(父类(super class)和子类)和所有行为(在父类(super class)中声明的任何方法) 仍然可以在 Subclass 的实例上使用,尽管有些可能被覆盖更特殊的行为)对于理解 Java 的多态性方法至关重要。

关于java - 创建子类的实例是否会自动创建其父类(super class)对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16498211/

相关文章:

java - 这个游戏的类设计(java)

java - Java 中人性化的日期逻辑库

java - 每个 iText 文档有多个渲染器 : Updated with more details

java - 从内部类访问通用外部类字段而不进行强制转换

c++如何返回当前类类型的对象(继承)

Javascript原型(prototype)继承私有(private)方法

angular - 从抽象类继承存在依赖注入(inject)问题

c++ - 使用父类的变量

java - 停止显示一个窗口直到它被完全绘制?

java - jdoQL中如何写IN子句查询?