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使用超類的方法相同的方法對亞類的對象
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使用超類的方法相同的方法對亞類的對象
不能從外面 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的期望(和封裝)。
好的,我即將測試..這是爲什麼? – 2013-03-26 07:11:37
@LewsTherin:哪位?重寫?重點是改寫對象的行爲。如果你可以通過鑄造別的東西來繞過它,那將毫無意義。這不僅會讓子類不愉快,而且會消除多態性本身的目的:我希望能夠在不知道其類型的情況下從任何InputStream *中讀取數據,並且仍然可以獲得重寫的行爲。 – 2013-03-26 07:15:03
大聲笑這是正確的,我只是測試了三種語言。我想我從來沒有想過它..謝謝! – 2013-03-26 07:26:27
該類本身是錯誤的。定義類名稱時不應添加括號。 可以使用任一對象類型鑄造或類B的方法test
class A
{
test()
{}
}
class B extends A
{
test()
{
super.test() // calls the test() method of base class
}
}
B b=new B();
我在想的鑄造,但我絕對不認爲你可以分配一個超類的子類變量。 – 2013-03-26 07:12:37
我認爲它會起作用。我以前做過這個。但我覺得不推薦使用類型轉換。 – iCode 2013-03-26 07:14:29
我也嘗試過,它不起作用。這是一個隱含的類型轉換:'((B)A)',這是沒有意義的。 – 2013-03-26 07:31:49
這可以用於使用派生類對象調用基類的方法調用super.test()
。
b.super.test()
你的方法目前沒有返回類型,並使用你的類聲明'()'不正確的 - 這是值得嘗試,以使示例儘可能完整(沒有多餘的代碼,當然)。如果你花些精力將它們格式化得很好,它也會有所幫助。我已經修復了這些問題,但請在將來的問題上投入更多精力。 – 2013-03-26 07:06:59
我會爲下一次做,但我更關心概念 – 2013-03-26 09:18:09
是的,但無效的代碼分心你正在尋找的概念。這是我的觀點。你應該努力讓你的問題儘可能容易讓人回答。你要求人們花時間幫助你 - 你應該儘可能地表達你的問題,並表達你的感謝。 – 2013-03-26 09:22:17