1

Java中的字符串被认为是不可变的。所以如果我说

String one = "myString";

String two = "myString";

在内部,两个对象都将使用相同的文字。现在让我感到困惑的是,为什么我应该在不同的类中将我的字符串设为私有,而在内部它们将引用相同的字符串文字。

仅仅是外部元素(如类或对象)不知道该类内部有哪些成员吗?

4

4 回答 4

1

可见性和访问权限实际上仅在编译期间存在,以检查您是否能够执行此操作或执行此操作,通常在运行时您可以调用私有方法或通过不同的 hack 更改不可变数据

还有一点:这些字符串是不可变的,所以你不能通过标准方法改变它们的值,所以它们可以在内存中的同一个地方,不管哪个类使用它们

于 2013-10-15T05:26:20.550 回答
0

对字符串引用使用私有会阻止来自外部对象的直接访问。但是 setter 和 getter 允许您访问/更改字符串变量(如果您设置了)。但是在 setter 方法中,您可以在更改值之前验证参数。这就是使用 setter 方法的主要优点。

然后,假设您在两个对象中有两个相等的私有字符串变量。那么这两个引用应该指向字符串池中的一个地方。但这听起来不是你可以从一个对象访问两个字符串(因为你总是使用受私有修饰符限制的引用变量)。

于 2013-10-15T13:38:25.810 回答
0

因为客户可以将您的内部成员设置为完全不同的东西。似乎您可能将 aString的不可变与引用的存在混淆了final

想象一下你有这个类:

public class MyClass {
    public String first = "Test";
    public String second = "Test";
}

因此,作为 Java 编译器专家,我们知道内部firstsecond引用同一个对象。凉爽的。

现在当我使用MyClass

MyClass myClass = new MyClass();
myClass.second = "Time to do some hackin'";

那很糟。就像真的很糟糕。

声明String成员private与失去编译器效率的优势无关。它是关于封装其实现的类,这样它的客户端就不会与它紧密耦合,因此该类不必担心由客户端所做的不负责任的事情引起的奇怪行为。

对象“Test”是不可变的这一事实并不意味着我不能改变firstsecond指向别的东西。

希望有帮助。

于 2013-10-15T05:50:50.973 回答
0

对于String参考,它并没有真正改变任何东西。这只是约定和封装的问题。如果您的其他字段是私有的并且有 getter 和 setter,为什么不应该使用您的String字段(除非它是要隐藏的)?

于 2013-10-15T05:26:31.047 回答