假设我有三节课:
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
}
}
我的问题是:
好问题。您正在研究的是Java如何初始化对象--涉及到许多步骤。
我知道是构造函数也是一种方法(也许我错了)。
差一点就对了。构造函数是一种特殊的方法。如果反编译类文件,您将看到构造函数被重命名为
。
的处理与其他方法不同,例如,除非使用关键字new
或super
才能显式调用。这是非常基本的,所以它是在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()
作为构造函数的第一行。这意味着构造函数严格按照以下顺序执行:
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