【发布时间】:2020-11-12 09:55:41
【问题描述】:
我被问到以下问题:
假设Java中类A的所有实例字段和所有实例方法都是私有的,下列哪项是正确的:
- A 是不可变的
- A 不一定是不可变的,因为它可能扩展了一个不可变的类
- A 不一定是不可变的,因为您可以通过静态方法更改其字段
我以为正确答案是 1,但结果 2 和 3 都是正确的,而 1 不是。
如果所有内容都是私有的,您仍然可以修改字段吗?
为什么如果它扩展了一个不可变的类,但仍然拥有私有的所有内容,它现在可能是不可变的?
从静态方法改变其字段是什么意思?
【问题讨论】:
-
不可变对象是在完全创建后其内部状态保持不变的对象。我们还应该有
final关键字。更多详情请阅读:baeldung.com/java-immutable-object -
2.如果它扩展了一个可变类,则它具有 A 声明的私有字段以外的字段。 3. A 中的静态方法可以完全访问 A 中的私有字段,因此它们可能会对其进行变异。
-
第2点:如果你有
public class A extends B,即使A的所有字段和方法都是私有的,你也不知道B声明了哪些字段。B可能有非私有字段/公共设置器。这些字段也将属于A(自A extends B),并且可以从类外部修改它们,从而使A的状态可变。 -
第3点:如果
A内部有public static方法,那么该方法可以访问A的私有字段。如果有人从外部调用静态方法,该方法可能会静音A的私有字段的状态。 -
@ucei
static字段或方法意味着它没有链接到类的特定实例,但它始终与类本身相同(“静态”)。你需要在静态方法中有一个A的实例,如果你尝试A a = new A();然后尝试访问a的私有字段(比如说a.x),你将能够做到这一点,即使x是private到A。
标签: java static field private final