[英]super() constructor within a subclass that extends a subclass?
我不确定我的问题是否正确,但我对这些代码行感到困惑。
public class First {
public String name() {
return "First";
}
}
public class Second extends First {
public void whoRules() {
System.out.print(super.name() + " rules");
System.out.println(" but " + name() + " is even better");
}
public String name() {
return "Second";
}
}
public class Third extends Second {
public String name() {
return "Third";
}
}
Second varSecond = new Second();
Third varThird = new Third();
varSecond.whoRules();
varThird.whoRules();
执行上述操作后,将打印出来
First rules but second is even better
First rules but third is even better
为什么不是:
First rules but second is even better
Second rules but third is even better
子类可以是另一个类的超类吗? 或者只能有一个(超类)? (使用示例代码段)据我所知, First
是一个超类Second
,但Second
对一超Third
? 或者First
是Third
超类?
如果有10个类相互延伸(第二个扩展第一个,第三个扩展第二个,等等)所有这些类的超类是否会是First
?)
为什么不会:......“第二条规则,但第三条规则更好”
因为类Second中的super.name()
引用了Second的超类,而不是实例的超类。
从Java语言规范 : 表单super.Identifier引用当前对象的名称Identifier的字段,但将当前对象视为当前类的超类的实例。
子类可以是另一个类的超类吗?
是。
或者只能有一个(超类)?
每个类最多可以有一个直接超类,而超类又可以有超类等。
(使用上面的示例代码)我理解First是Second的超类,但是Second是Second的超类? 或者首先是第三个超类?
First和Second都是Third的超类。
其次是Third的直接超类。
Third varThird = new Third();
由于Third类没有whoRules()方法。 它调用超类方法。
如果在调用期间未指定任何对象,则编译器使用“this”关键字进行调用。 这就是为什么,this.name()打印“Third”作为whoRules()方法被第三个Class对象调用。因此结果 - “第一个规则,但第三个甚至更好。”
这是因为你从Second类调用super,它从First类调用super.name()。 第二个超级永远是第一位的
这是简单的继承。 第一个是第二个超级类,第二个是超级第三类。 基本上,当您创建第三类的对象时,它将从父类继承所有(非私有)属性,这些属性都是First和Class。
First -> Second -> Third
超级关键字 - 在给定的示例中,您将重写(在子类中实现超类方法)超类的方法名称()在子类second中使用第一个。使用关键字super.name()可以调用名称()超类的方法。
我想让你记住的最重要的事情是
java编译器调用基于Reference类型而不是对象类型的方法
当你说
varSecond.whoRules();
在这种情况下,对象引用属于类Second
System.out.print(super.name() + " rules");//calls the name() in class First
System.out.println("but" + name()+"is even better");//calls the name() in class Second
但是当你说
varThird.whoRules();
在这种情况下,对象引用属于第三类
System.out.print(super.name() + " rules");//calls the name() in class First
System.out.println("but" + name()+"is even better");//calls the name() in class Third
只是因为name()方法是在第三类中定义的。 如果你没有在第三类中定义name()方法,那么它将调用超类方法。
并且回答你的另一个问题,对继承的深度没有硬限制,但通常你不会在一个好的设计中看到层次结构中的10个超类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.