我在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. 在Scala中调用私有Java方法
- 23. java私有方法返回公开
- 24. Java扩展最终类
- 25. Java最终抽象类
- 26. 如何测试私有静态类的私有方法
- 27. 访问私有类中的私有方法
- 28. 获取抽象类中私有最终字段的引用
- 29. 从另一个类访问私有最终静态双
- 30. 我可以在抽象类中有私人最终字段吗
这个问题本身解释什么是目标*是为了使一个类不可变*而不是使方法不被重写。 – nullpointer
如果您在子类中添加新的方法和字段@kltis – VedX