Java 为什么这些构造函数按这种顺序运行?
我已经了解了对象应该像这样创建Java 为什么这些构造函数按这种顺序运行?,java,object,constructor,Java,Object,Constructor,我已经了解了对象应该像这样创建Class\u name object\u name=new Classname()。在我的程序中,我创建了一个名为sup的超类和一个名为der的派生类。在我的子类构造函数中,我创建了这样一个对象sup obc=new der()。在没有任何错误的情况下,它编译并给出如下输出: 对象作为引用传递的超类中的 在没有构造函数的超类中 在没有构造函数的派生类中 我不明白我是如何得到这个顺序的输出的。为什么会发生这种情况?以下是完整的代码: class sup {
Class\u name object\u name=new Classname()
。在我的程序中,我创建了一个名为sup
的超类和一个名为der
的派生类。在我的子类构造函数中,我创建了这样一个对象sup obc=new der()代码>。在没有任何错误的情况下,它编译并给出如下输出:
对象作为引用传递的超类中的
在没有构造函数的超类中
在没有构造函数的派生类中
我不明白我是如何得到这个顺序的输出的。为什么会发生这种情况?以下是完整的代码:
class sup {
private int a, b, c;
sup(sup ob) {
System.out.println("In Superclass with object passed as reference");
a = ob.a + 9;
b = ob.b + 9;
}
sup(int a, int b) {
this.a = a;
this.b = b;
}
sup() {
System.out.println("In Superclass with no constructor");
}
}
class der extends sup {
int d;
der(der ob) {
super(ob);
sup obc = new der();
}
der() {
System.out.println("In derived class with no constructor");
}
der(int a, int b, int c) {
super(a, b);
d = c;
}
}
public class Test {
public static void main(String args[]) {
der ob1 = new der(3, 4, 5);
der ob2 = new der(ob1);
}
}
这样做的第一件事是调用超类构造函数sup(sup obj)
(它打印第一个输出行),然后代码(没有任何原因)分配一个新的der()
但是在Java中,超类默认构造函数在子类构造函数之前被隐式调用,实际上der()
构造函数实现可以看作是
der()
{
super();
System.out.println("In derived class with no constructor");
}
这解释了第二个和第三个输出行。第一个调用:
der ob1 = new der(3, 4, 5);
不打印任何内容,因为它首先调用:
der(int a, int b, int c) {
super(a, b);
这要求:
sup(int a, int b) {
this.a = a;
this.b = b;
}
它没有System.out.println
语句。没有调用任何其他构造函数,因为从不显式调用它们。隐式的sup()
构造函数没有被调用,因为您已经调用了super(a,b)
第二个电话:
der ob2 = new der(ob1);
调用此构造函数:
der(der ob) {
super(ob);
sup obc = new der();
}
der() {
System.out.println("In derived class with no constructor");
}
发生的第一件事是调用这里的超级构造函数:
sup(sup ob) {
System.out.println("In Superclass with object passed as reference");
这是打印的第一件事。然后,第二行:
sup obc = new der();
调用,它调用此构造函数:
der(der ob) {
super(ob);
sup obc = new der();
}
der() {
System.out.println("In derived class with no constructor");
}
但是,有一个隐式调用super()这里的代码>总是在子类中调用,即使您没有编写它。因此,我们称之为:
sup() {
System.out.println("In Superclass with no constructor");
}
这将被打印出来,最后,der
的构造函数可以完成
请注意,如果删除sup
的无参数构造函数,der
将不再编译,并出现以下错误:
隐式超级构造函数ArrayListTest.sup()
未定义。必须显式调用另一个构造函数
第一个der
对象调用没有输出的super(a,b)
构造函数。第二个调用sup(sup ob)
,它给出第一行输出,然后它还调用new der()
,当子类的默认构造函数被调用时,它的超类的默认构造函数也被调用。这就是第二条线的来源。然后new Der()
输出第三行。请确保遵守Java命名约定,尤其是在这些格式化的第一个程序中。在Java中,类名称使用PascalCase
,变量使用camelCase
。此外,请在发布之前格式化您的代码。由于我是java新手,我将很快学习java命名约定@BoristheSpider@Ashokkumar不要在将来学习,你应该试着现在编辑并学习。@karthik是的。我已经把代码格式化了一点。从现在起,我将使用正确的命名约定。@Ashokkumar不要手工格式化代码!那是一项徒劳的任务。让IDE为您自动格式化。