[英]Inheritance, Calling Methods from Sub-Classes
我們今天在我的comp sci講座中討論了繼承問題,並討論了從其他類訪問方法的問題。 我的一位同學問子班級如何訪問最高父母班級方法,而我的教授也對此感到很好奇,並提出了類似的建議:
super.super.toString();
可能能夠工作,但事實並非如此。 好奇的是,我試圖自己解決這個問題,並提出了以下建議:
public class A {
public static void main(String[] args){
B b = new B();
C c = new C();
System.out.println(b.toString());
System.out.println(c.toString());
}
public String toString(){
return "Class A";
}
}
class B extends A {
public String toString(){
return "Class B";
}
}
class C extends B {
public String toString(){
return A.class.toString();
}
}
現在解決了,在測試各種東西時,我偶然發現了這一點:(所有這些都將在C類中完成)
super.toString();
似乎做與以下事情相同的事情:
B.class.toString();
我的問題是兩者之間有什么區別,還是完全一樣? 同樣在我上面的代碼中,這是從子子類中調用方法的正確方法嗎?
不, B.class.toString()
將在Class
類上調用toString()
方法。 這甚至不是稍微一回事調用super.toString()
無法從C
調用A
的toString()
的實現,而繞過A
基本上,這將破壞封裝。
不,他們不是一回事。 假設您正在從類C
調用super.toString()
,這將在B
上調用toString()
,這將返回“類B”。
當您調用A.class.toString()
或B.class.toString()
您根本沒有調用任何超類方法,而是在Class
上調用toString
。
class Parent{
public void foo(){
}
}
class Child extends Parent{
@Override
public void foo(){
super.foo(); //will call the parent class foo method
}
}
class ChildOfChild extends Child{
public void bar(){
super.foo(); //this actually is the method of the Parent that is actually called at the end as Child calls super.foo();
}
}
super.toString();
和B.class.toString()
完全不同。 在后面的代碼中,您將調用文字類的toString()
方法。
如示例中所示,如果子子類調用層次結構中定義的方法,則取決於實現方式將調用哪個方法。 如果直接父將覆蓋方法,並且不調用super.method()
則(父母的父母的方法) 不能被調用。 這就是繼承的原理。
如果直接父級沒有重寫該方法,而您從子子類中調用方法,則將調用直接父級的父級的方法。
如果您嘗試訪問toString()內的任何狀態(您未按照自己的意圖進行操作),就會很快看到。
SomeClass.class是一個特殊的構造。 有關確切定義,請參見http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.2 。
您可能不使用super.super,因為Java實際上是被設計為強制您正確使用對象和面向對象的模式。 不應允許您跳過父類的實現,因此是不允許的。 與其他較不嚴格的語言相比,這實際上是Java的困擾之一,但是它確實迫使您真正考慮類的層次結構和所做的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.