2010-09-01 51 views
7

剛開始使用Java。我發現與.NET有許多相似之處,但我發現Java中的所有方法默認都是虛擬的。 所以問題是我能做些什麼來使它們不是虛擬的? final關鍵字是一種正確的解決方案嗎?Java中的非虛擬方法

+0

http://download.oracle.com/javase/tutorial/java/IandI/final.html – 2010-09-01 18:36:44

+5

猜猜看,在'C#.NET'中發現了很多與'JAVA'類似的東西......因爲我有一些與我父親的相似之處...... – 2010-09-01 18:38:57

+5

@Garis無法理解你的觀點......它是如何與問題相關的? – NixDev 2010-09-01 18:42:12

回答

8

是的,或私人

+5

但'private' - 就像在.net中一樣 - 使得該方法不可用於其他類的調用,以及防止重寫。 – 2010-09-01 18:37:38

+2

但是當我需要在子類中使用與父類中相同的名稱的方法時,我該怎麼辦?在C#中,這種情況下有一個新的關鍵字...在Java中有類似的東西。 – NixDev 2010-09-01 18:44:53

+1

nope,什麼也沒有 – 2010-09-01 19:14:13

2

而不是定義的所有方法爲final的,你也可以定義整個類爲final。我不是在說這種好或壞的風格。

6

如果你打算讓這個方法對於性能來說是非虛擬的,讓JIT來處理,直到你有證據表明它沒有做。

如果讓方法成爲非虛擬的原因是爲了能夠在一個子類中定義它,但不涉及多態性,那麼您可能沒有真正原因的子類化(發佈更多的代碼,如果您想對此進行比較)。

如果是爲了設計,我建議讓班級最終取代個別方法,如果可能的話。 IDEA對班級設計進行了很好的檢查。儘量不要過於密切地傾聽那些希望你放下所有東西的人的意見,以便他們可以繼承問題以解決錯誤或限制;當你不小心破壞他們的子類時,他們會更大聲地對你大喊。

爲客戶提供一種方法來添加自己的類型而不是子類,他們甚至可能不會注意到您的類是最終的。

1

使其成爲靜態。

如果你調用一個非虛方法,那麼你想從你的代碼中知道你調用的是哪個類方法。 .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中定義的。

+2

否。不要使方法屬於對象時爲靜態方法。這是非常糟糕的設計。 – Cephalopod 2015-04-24 20:32:22