2013-03-26 83 views
1
class A { 
    void test() { 
    } 
} 

class B extends A { 
    void test() { 
    } 

public static void main(String[] args) 
{ 
B b=new B(); 
//insert code here 
} 
} 

我怎樣才能調用類A的對象爲b類B的方法test? 專爲對象B使用超類的方法相同的方法對亞類的對象

+6

你的方法目前沒有返回類型,並使用你的類聲明'()'不正確的 - 這是值得嘗試,以使示例儘可能完整(沒有多餘的代碼,當然)。如果你花些精力將它們格式化得很好,它也會有所幫助。我已經修復了這些問題,但請在將來的問題上投入更多精力。 – 2013-03-26 07:06:59

+0

我會爲下一次做,但我更關心概念 – 2013-03-26 09:18:09

+0

是的,但無效的代碼分心你正在尋找的概念。這是我的觀點。你應該努力讓你的問題儘可能容易讓人回答。你要求人們花時間幫助你 - 你應該儘可能地表達你的問題,並表達你的感謝。 – 2013-03-26 09:22:17

回答

14

不能從外面 B呼叫了...但 B可以稱其爲:

super.test(); 

這可以從任何代碼B內完成 - 它不必在test()方法本身。因此,例如:

public void foo() { 
    // Call the superclass implementation directly - no logging 
    super.test(); 
} 

@Override void test() { 
    System.out.println("About to call super.test()"); 
    super.test(); 
    System.out.println("Call to super.test() complete"); 
} 

注意@Override註釋告訴編譯器,你真的沒意味着覆蓋的方法。 (除了別的以外,如果在方法名中有錯字,這將幫助您快速找到它。)

您無法從外部B調用它的原因是B 覆蓋了該方法。重寫的目的是取代原來的行爲。例如,在使用參數的方法中,在調用超類實現或執行其他操作之前,B可能希望根據參數(根據自己的規則驗證它)做些什麼。如果外部代碼可以調用A的版本,那將違反B的期望(和封裝)。

+0

好的,我即將測試..這是爲什麼? – 2013-03-26 07:11:37

+0

@LewsTherin:哪位?重寫?重點是改寫對象的行爲。如果你可以通過鑄造別的東西來繞過它,那將毫無意義。這不僅會讓子類不愉快,而且會消除多態性本身的目的:我希望能夠在不知道其類型的情況下從任何InputStream *中讀取數據,並且仍然可以獲得重寫的行爲。 – 2013-03-26 07:15:03

+0

大聲笑這是正確的,我只是測試了三種語言。我想我從來沒有想過它..謝謝! – 2013-03-26 07:26:27

0

該類本身是錯誤的。定義類名稱時不應添加括號。 可以使用任一對象類型鑄造或類B的方法test

class A 
{ 
test() 
{} 
} 

    class B extends A 
    { 
    test() 
    { 
    super.test() // calls the test() method of base class 
    } 
    } 


    B b=new B(); 
+0

我在想的鑄造,但我絕對不認爲你可以分配一個超類的子類變量。 – 2013-03-26 07:12:37

+0

我認爲它會起作用。我以前做過這個。但我覺得不推薦使用類型轉換。 – iCode 2013-03-26 07:14:29

+0

我也嘗試過,它不起作用。這是一個隱含的類型轉換:'((B)A)',這是沒有意義的。 – 2013-03-26 07:31:49

0

這可以用於使用派生類對象調用基類的方法調用super.test()

b.super.test()