我在Java中學習不變性時遇到了這個問題。據說爲了使一個類不可變,這個類應該被聲明爲final,這樣它的方法就不能被擴展。我有這樣一個問題,如果我在java中標記私有方法或方法final,我可以達到相同的效果。如果我這樣做,我不必把班級標記爲最終的。我得到這個正確的。你對此的看法高度讚賞。Java:私有方法vs最終類
0
A
回答
1
非終極類沒有公共變異方法或字段的事情是,你仍然可以繼承它的子類。
說你有這樣的不可變類:
class Point {
private int x, y;
// getters
// constructors
}
該類沒有公共誘變方法或字段,但它不是最終的,所以其他人還可以繼承它,使其變更:
class MyPoint extends Point {
public int foo;
}
現在突然間,您可以根據需要更改foo
的值。 MyPoint
現在變得可變!
這就是爲什麼你應該將不可變類標記爲final。
4
A final
Java中的類不能被子類化。這意味着,根據定義,其方法不能重載,也不能向類中添加新的方法(行爲)。另一方面,如果你要標記一個類final
的所有方法,那麼它意味着不同的東西。方法不能被覆蓋或隱藏。但是,單獨標記所有方法final
仍然可以將該類繼承爲子類,並將新方法/行爲添加到該類中。
1
允許重寫一個不可變的類也允許添加可變數據。
class SuddenlyMutableString extends String {
private int id;
public int getId() { return id; }
public void setId(int i) { id = i; }
}
所以當你的方法設置final
可以防止現有數據的可變性,你可能仍然得到可變的子類。
相關問題
- 1. OOP:私有方法VS新類
- 2. java @SafeVarargs爲什麼私有方法需要是最終的
- 3. 在最終(實用)類中嘲諷私有靜態方法
- 4. java單例類vs最終類
- 5. 最終方法的Java類裝飾器
- 6. Java - 私有成員vs私有內部類的默認成員
- 7. Java私有方法覆蓋
- 8. 在方法中調用私有最終變量時出現NullPointerException
- 9. 使用幫助器私有方法初始化最終屬性
- 10. Ruby的私有類方法
- 11. 類方法:以私有方法傳遞私有數據字段
- 12. 塊vs私人方法?
- 13. 沒有最終的方法
- 14. Java - 瞭解私有最終自定義類型的返回類型
- 15. Java - 方法和最終變量
- 16. 有很多私有方法的Java測試類
- 17. 非最終類中的代理最終方法
- 18. Java方法()++ VS方法()+ 1
- 19. 覆蓋最終BluetoothDevice類的toString()方法
- 20. Java類中方法的靜態最終常量的位置
- 21. Java的私有方法包裝
- 22. java私有方法返回公開
- 23. 在Scala中調用私有Java方法
- 24. Java擴展最終類
- 25. Java最終抽象類
- 26. 如何測試私有靜態類的私有方法
- 27. 訪問私有類中的私有方法
- 28. 我可以在抽象類中有私人最終字段嗎
- 29. 獲取抽象類中私有最終字段的引用
- 30. 從另一個類訪問私有最終靜態雙
這個問題本身解釋什麼是目標*是爲了使一個類不可變*而不是使方法不被重寫。 – nullpointer
如果您在子類中添加新的方法和字段@kltis – VedX