日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java隐藏与覆盖_java中方法的隐藏和覆盖问题?

發布時間:2023/12/2 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java隐藏与覆盖_java中方法的隐藏和覆盖问题? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ok()方法在繼承時候發生覆蓋(重寫)了嗎?

發生了。在子類B中的ok()方法擁有父類方法相同的方法名和參數列表(signature),所以在這里發生了重寫。調用B類對象的ok()方法會print "b",父類方法被覆蓋。

如果是重寫了,那定義一個b類的對象還能再調用a類繼承的ok()函數嗎?

可以。方法就是利用super關鍵字。@陸萌萌 的答案已經解釋了。

a類的ok()函數是在子類中隱藏了嗎?能告訴我覆蓋和隱藏分別應該怎么用怎么寫嗎?

錯誤。我回答這個問題主要就是為了說明這個易混點。

在Java中并沒有隱藏的概念,只有重載overload和重寫override,隱藏(redifine)是C++中的概念,網絡上很多人將之帶到了Java,以為在Java中也有這樣的區分。

1.) 在C++中,同一類內相同函數名不同參數列表的函數為重載;

2.) 父類與子類間相同名字相同參數列表,且父類函數有virtual標識符的為重寫;

3.) 父類與子類間相同名字不同參數列表,此時無論有無virtual標識符,或者父類與子類間相同名字相同參數列表,但是父類函數中沒有virtual標識符,則為隱藏,或者說重定義redifine。

Java中,情況簡化了許多。Java里沒有virtual標識符,按照上面三種情況劃分:

1.) 同一類內相同方法名不同參數列表的方法為重載;

2.) 父類與子類間相同名字相同參數列表,為重寫(覆蓋),這里與C++的區別是,Java中不需要有virtual標識符;

3.) 父類與子類間相同名字不同參數列表,此時按C++中的邏輯應該算是重定義(隱藏), 但是Java中沒有隱藏的概念。在具體實現中,父類中的函數,會被繼承下來,和子類中的同名函數,一起成為子類中的重載函數 。這個實現其實是與重載的定義相悖的,因為重載要求必須是在同一類內的相同名字不同參數列表的方法,而在這里,重載跨越了父類與子類。

以下為實際測試代碼:

class a{

public void ok()

{system.out.println("a");}

}

class b extends a{

public void ok(int c)

{system.out.println("b");}

}

class hello{

public static void main()

{

a A =new b();

A.ok();

A.ok(1);

}

}

在Java中,這里程序會輸出"a b"。子類對象中隱式地包含了ok(),ok(int c)兩個重載方法。

在C++中,同樣結構的代碼,這里會出現編譯錯誤,因為父類中的ok()被子類的ok(int c)隱藏,在子類對象中根本找不到ok()這個函數。

相比較而言,C++規范更明確,每種情況條分縷析;Java在實現上雖然更簡單方便,但其實與重載的定義是相悖的。

總結

以上是生活随笔為你收集整理的java隐藏与覆盖_java中方法的隐藏和覆盖问题?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。