【发布时间】:2012-02-06 20:13:48
【问题描述】:
super() 隐式放置在每个构造函数中,以便它获取父类中提到的方法。层次结构中最高的类是Object。
问题是Object 类的super() 指向哪里?
【问题讨论】:
super() 隐式放置在每个构造函数中,以便它获取父类中提到的方法。层次结构中最高的类是Object。
问题是Object 类的super() 指向哪里?
【问题讨论】:
你可能会觉得这很有趣。
System.out.println("System.class.getSuperclass()= "+System.class.getSuperclass());
System.out.println("Object.class.getSuperclass()= "+Object.class.getSuperclass());
打印
System.class.getSuperclass()= class java.lang.Object
Object.class.getSuperclass()= null
【讨论】:
查看source code for Object很有启发性
如您所见,它没有基类(请注意,隐含的基类是Object,但在这种情况下怎么可能呢?)
正如代码 cmets 中所述,它是 Java 层次结构的根。因此,这是一种特殊情况,没有超类调用。
【讨论】:
Object 类不能有 super(),它是类层次结构中的最高项。它下面的所有东西都会有一个 super() 但不是 Object。
【讨论】:
见 JLS 的12.5 Creation of New Class Instances
如果此构造函数用于
Object以外的类,则此构造函数将以显式或隐式调用超类构造函数开始(使用super)。
【讨论】:
Object 中不会有 super。
【讨论】:
对象类是java中所有类的基础,所以不会在对象类的构造函数中调用super()。
它没有被任何类扩展,因此很明显它没有在其构造函数中调用 super。
【讨论】:
当链条停在 Object 处时想一想。
喜欢 A -> super() -> B->super() -> 停止
【讨论】:
您可以通过编写两个类并从另一个类扩展一个类来检查这一点
例如:
将 A 类创建为:
class A{
int a, b;
A(int a, int b){
}
}
创建扩展类 A 的类 B:
class B extends A{
public static void main(String a[]){
B b = new B();
}
}
当你尝试创建 B 类的对象时会出错,因为 B 类默认构造函数被调用,而 intrun 调用超类“A”的默认构造函数,但 A 类没有任何默认值或零参数构造函数。
【讨论】: