当前位置: 首页 > 知识库问答 >
问题:

在Java中有多少对象是由于继承而创建的?

苗学民
2023-03-14

假设我有三节课:

class A {
    A() {
        // super(); 
        System.out.println("class A");
    }
}
class B extends A {
    B() {
        // super(); 
        System.out.println("class B");
    }
}
class C extends B {
    public static void main(String args[]) {
        C c = new C(); //Parent constructor will get called
    }
}

我的问题是:

  1. 在这种情况下创建了多少个对象?
  2. 如果创建了一个对象,那么Super()如何在内部调用父类构造函数?

共有1个答案

锺离明煦
2023-03-14

好问题。您正在研究的是Java如何初始化对象--涉及到许多步骤。

我知道是构造函数也是一种方法(也许我错了)。

差一点就对了。构造函数是一种特殊的方法。如果反编译类文件,您将看到构造函数被重命名为 的处理与其他方法不同,例如,除非使用关键字newsuper才能显式调用。这是非常基本的,所以它是在JVM本身中实现的,而不是在Java语言中定义的东西。

创建了一个对象-C的实例。

C还同时是B的实例、A的实例以及Object

如果创建了一个对象,那么super()如何在内部调用父类构造函数。超级如何能够调用父类构造函数。

private int a = 10;
private int b = a * 5;
private String c = Singleton.getInstance().getValue();

注意(1)成员初始化严格按照在类中声明成员的顺序进行。这意味着《宣言》后面提到成员的地方被删除:

private int a = b * 5; // Forward reference; won't compile
private int b = 10;

注意(2)Java中有一个未被充分使用的工具,可以在执行构造函数之前运行任意代码来初始化值。这些代码块此时再次严格按照声明的顺序执行:

private int a;
private int b = 1;
{
    // Initization occurs after b but before c.
    // c cannot be referenced here at all
    int i = SomeClass.getSomeStatic();
    a = i * 2;
}
private int c = 99;

执行C的构造函数。构造函数必须直接从超类调用构造函数,或者编译器将自动添加super()作为构造函数的第一行。这意味着构造函数严格按照以下顺序执行:

    null
public class Wrong {
    int a = getB(); // Don't do this!
    int b = 10;
    public int getB() {
         return b;
    }
}

这里,A被初始化为0。这是因为,在调用getb()时,Java已将b的值清除为默认值(0),但尚未在初始化的第二阶段将其设置为10

总而言之--只有一个对象,并且它是在多个阶段中创建和初始化的。在这些阶段,根据定义,对象不是完全定义的。

 类似资料:
  • 问题内容: 假设我有三节课: 当我创建类C的实例时,它将调用超类的构造函数。那么,是否有多个对象正在创建?如果仅创建一个对象,那么super()像另一个类的构造函数如何?super()方法是否在内部创建对象?我所知道的是,构造函数也是一种方法(我可能错了)。 我的问题是: 在这种情况下创建了多少个对象? 如果创建了一个对象,那么Super()如何在内部调用父类的构造函数? 问题答案: 好问题。您要

  • 创建对象的几种方式 通过Object <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>01_Object构造函数模式</title> </head> <body> <!-- 方式一: Object构造函数模式 * 套路: 先创建空Object对象, 再动态添加属性/方法 * 适用场景

  • 所以我不确定是0还是2。 如果有人知道请告诉我。

  • 如果我们使用 那么创建了多少对象,它们驻留在哪里?

  • 问题内容: 偏重于继承而不是继承 是非常流行的短语。我读了几篇文章,最后每篇文章都说 当类之间存在纯IS-A关系时,请使用继承。 本文中的一个示例: 在 Apple 和 Fruit 之间存在明显的IS-A关系,即Apple IS-A Fruit,但作者也将其显示为Apple HAS-A Fruit(组成),以显示通过继承实现时的陷阱。 我在这里变得有些困惑,声明的含义是什么 当类之间存在纯IS-A