我不确定我的问题是否正确,但我对这些代码行感到困惑。
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
吗?)
答案 0 :(得分:3)
为什么不会:......“第二条规则,但第三条规则更好”
因为类Second中的super.name()
引用了Second的超类,而不是实例的超类。
来自Java Language Specification:表单super.Identifier是指当前对象的名为Identifier的字段,但当前对象被视为当前类的超类的实例。
子类是否可以成为另一个类的超类?
是
或者只能有一个(超类)?
每个类最多只能有一个直接超类,而超类又可能有超类等。
(使用上面的示例代码)我理解First是Second的超类,但是Second是Second的超类吗?或者首先是第三个超类?
First和Second都是Third的超类。
其次是第三个直接超类。
答案 1 :(得分:1)
Third varThird = new Third();
由于Third类没有whoRules()方法。它调用超类方法。
如果在调用期间未指定任何对象,则编译器使用“this”关键字进行调用。那就是为什么,this.name()打印“Third”作为whoRules()方法被第三个Class对象调用。因此结果 - “第一个规则,但第三个甚至更好。”
答案 2 :(得分:0)
这是因为你从Second类调用super,它从First类调用super.name()。 第二个超级永远是第一个
答案 3 :(得分:-1)
这是简单的继承。第一个是第二个超级类,第二个是超级第三类。基本上,当您创建第三类的对象时,它将继承父类的所有(非私有)属性,这些属性都是第一和第二类。
First -> Second -> Third
超级关键字 - 在给定的示例中,您将重写(在子类中实现超类方法)子类second中的超类First的方法名称()。使用关键字super。 name()允许你调用超类的name()方法。
我希望你记住的最重要的事情是
java编译器调用基于Reference类型的方法而不是 对象类型
当你说
时varSecond.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 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个超类。