簡體   English   中英

子類的繼承,調用方法

[英]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調用AtoString()的實現,而繞過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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM