Java中的字符串被认为是不可变的。所以如果我说
String one = "myString";
和
String two = "myString";
在内部,两个对象都将使用相同的文字。现在让我感到困惑的是,为什么我应该在不同的类中将我的字符串设为私有,而在内部它们将引用相同的字符串文字。
仅仅是外部元素(如类或对象)不知道该类内部有哪些成员吗?
Java中的字符串被认为是不可变的。所以如果我说
String one = "myString";
和
String two = "myString";
在内部,两个对象都将使用相同的文字。现在让我感到困惑的是,为什么我应该在不同的类中将我的字符串设为私有,而在内部它们将引用相同的字符串文字。
仅仅是外部元素(如类或对象)不知道该类内部有哪些成员吗?
可见性和访问权限实际上仅在编译期间存在,以检查您是否能够执行此操作或执行此操作,通常在运行时您可以调用私有方法或通过不同的 hack 更改不可变数据
还有一点:这些字符串是不可变的,所以你不能通过标准方法改变它们的值,所以它们可以在内存中的同一个地方,不管哪个类使用它们
对字符串引用使用私有会阻止来自外部对象的直接访问。但是 setter 和 getter 允许您访问/更改字符串变量(如果您设置了)。但是在 setter 方法中,您可以在更改值之前验证参数。这就是使用 setter 方法的主要优点。
然后,假设您在两个对象中有两个相等的私有字符串变量。那么这两个引用应该指向字符串池中的一个地方。但这听起来不是你可以从一个对象访问两个字符串(因为你总是使用受私有修饰符限制的引用变量)。
因为客户可以将您的内部成员设置为完全不同的东西。似乎您可能将 aString
的不可变与引用的存在混淆了final
。
想象一下你有这个类:
public class MyClass {
public String first = "Test";
public String second = "Test";
}
因此,作为 Java 编译器专家,我们知道内部first
并second
引用同一个对象。凉爽的。
现在当我使用MyClass
:
MyClass myClass = new MyClass();
myClass.second = "Time to do some hackin'";
那很糟。就像真的很糟糕。
声明String
成员private
与失去编译器效率的优势无关。它是关于封装其实现的类,这样它的客户端就不会与它紧密耦合,因此该类不必担心由客户端所做的不负责任的事情引起的奇怪行为。
对象“Test”是不可变的这一事实并不意味着我不能改变first
或second
指向别的东西。
希望有帮助。
对于String
参考,它并没有真正改变任何东西。这只是约定和封装的问题。如果您的其他字段是私有的并且有 getter 和 setter,为什么不应该使用您的String
字段(除非它是要隐藏的)?