剛開始使用Java。我發現與.NET有許多相似之處,但我發現Java中的所有方法默認都是虛擬的。 所以問題是我能做些什麼來使它們不是虛擬的? final
關鍵字是一種正確的解決方案嗎?Java中的非虛擬方法
回答
是的,或私人
但'private' - 就像在.net中一樣 - 使得該方法不可用於其他類的調用,以及防止重寫。 – 2010-09-01 18:37:38
但是當我需要在子類中使用與父類中相同的名稱的方法時,我該怎麼辦?在C#中,這種情況下有一個新的關鍵字...在Java中有類似的東西。 – NixDev 2010-09-01 18:44:53
nope,什麼也沒有 – 2010-09-01 19:14:13
而不是定義的所有方法爲final的,你也可以定義整個類爲final。我不是在說這種好或壞的風格。
如果你打算讓這個方法對於性能來說是非虛擬的,讓JIT來處理,直到你有證據表明它沒有做。
如果讓方法成爲非虛擬的原因是爲了能夠在一個子類中定義它,但不涉及多態性,那麼您可能沒有真正原因的子類化(發佈更多的代碼,如果您想對此進行比較)。
如果是爲了設計,我建議讓班級最終取代個別方法,如果可能的話。 IDEA對班級設計進行了很好的檢查。儘量不要過於密切地傾聽那些希望你放下所有東西的人的意見,以便他們可以繼承問題以解決錯誤或限制;當你不小心破壞他們的子類時,他們會更大聲地對你大喊。
爲客戶提供一種方法來添加自己的類型而不是子類,他們甚至可能不會注意到您的類是最終的。
使其成爲靜態。
如果你調用一個非虛方法,那麼你想從你的代碼中知道你調用的是哪個類方法。 .net的缺點是你無法從你的代碼中知道。
例
在Java中,如果你定義爲ClassB的
public class ClassB extends ClassA {
@Override
public void run() {
}
}
和對象
ClassA obj=new ClassB();
如果調用obj.run(),您將如何知道這碼遵循多態開放/關閉原則的規則,還是會編碼與ClassA相關的方法?在Java中,你會知道總是存在多態性。製作嘲笑比較容易,擴展類並遵循Liskov替代原則更容易。
在另一方面靜態方法是有界的一類,所以如果你要調用有關ClassA的一個方法,你可以定義像這樣的方法:
public static run(ClassA obj)
,你可以用
叫它ClassB obj=new ClassB();
ClassA.run(obj);
從代碼中您將知道您調用的方法是在ClassA中定義的,而不是在ClassB中定義的。
否。不要使方法屬於對象時爲靜態方法。這是非常糟糕的設計。 – Cephalopod 2015-04-24 20:32:22
- 1. 相同類中的虛擬方法vs非虛擬方法
- 2. 覆蓋非虛擬方法?
- 3. 虛擬非方法成員
- 4. 虛擬方法比非虛擬方法要慢
- 5. 重載虛擬方法與非虛擬方法有何不同?
- 6. 如何模擬非虛擬方法?
- 7. 在C#中嘲弄非虛擬方法#
- 8. Java虛擬方法調用
- 9. 如何調用(非虛擬)虛擬方法的原始實現?
- 10. .NET中的虛假/存根非虛擬方法
- 11. 如何覆蓋非虛擬方法?
- 12. 模擬非虛方法C++(gmock)
- 13. 如果類也有非虛擬方法,嘲弄純虛擬方法?
- 14. 虛擬方法
- 15. 類中的虛擬方法
- 16. C++從實現的虛擬類調用非虛方法
- 17. GMock和模擬非虛擬方法的構造函數
- 18. 虛擬方法不是演戲虛擬
- 19. '虛擬XYZ' VS 'XYZ虛擬' 方法
- 20. java虛擬方法:功能還是bug?
- 21. Java初學者幫助虛擬方法
- 22. 從非虛擬父類虛擬類繼承的正確方式
- 23. c#虛擬方法
- 24. 虛擬方法表
- 25. 虛擬方法C++
- 26. 非虛擬方法和密封方法有什麼區別?
- 27. C++非虛方法
- 28. TypeMock如何模擬密封類和非虛擬方法?
- 29. 使用/不使用虛擬方法實現純虛擬方法?
- 30. 帶空虛的虛擬方法和純虛擬方法有什麼區別?
http://download.oracle.com/javase/tutorial/java/IandI/final.html – 2010-09-01 18:36:44
猜猜看,在'C#.NET'中發現了很多與'JAVA'類似的東西......因爲我有一些與我父親的相似之處...... – 2010-09-01 18:38:57
@Garis無法理解你的觀點......它是如何與問題相關的? – NixDev 2010-09-01 18:42:12