Java中的字符串被认为是不可变的。 所以,如果我说
String one = "myString";
和
String two = "myString";
在内部,两个对象都将使用相同的文字。 现在让我感到困惑的是为什么我应该在不同的类中将我的字符串设为私有,在内部时它们将引用相同的字符串文字。
只是外部元素(如类或对象)不知道类中有哪些成员?
答案 0 :(得分:1)
实际上只有在编译期间才存在可见性和访问权限,以检查您是否能够执行此操作,或者在运行时通常可以通过不同的hack调用私有方法或更改不可变数据
另一点:这些字符串是不可变的,所以你不能通过标准方法改变它们的值,所以它们可以在内存中相同的位置,并且它与哪个类使用它们无关紧要
答案 1 :(得分:0)
对于String
引用,它并没有真正改变任何东西。这只是一个约定和封装的问题。如果您的其他字段是私有的并且有getter和setter,为什么不应该String
字段(除非它意味着被隐藏)?
答案 2 :(得分:0)
因为客户端可以将内部成员完全设置为其他内容。看起来您可能会混淆String
是不可变的,引用为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
与失去编译器效率的优势无关。它是关于封装其实现的类,因此它的客户端没有紧密耦合,因此类不必担心由客户端不负责任的行为引起的奇怪行为。
对象“测试”是不可变的这一事实并不意味着我无法将first
或second
更改为指向其他内容。
希望有所帮助。
答案 3 :(得分:0)
使用private for String引用阻止外部对象的直接访问。但是setter和getter允许你访问/更改字符串变量(如果你设置)。但是在setter方法中,您可以在更改值之前验证参数。这是使用setter方法的主要优势。
然后,假设您在两个对象中有两个相等的私有字符串变量。然后这两个引用应该指向字符串池中的一个位置。但这听起来不是你可以从一个对象访问两个字符串(因为你总是使用受私有修饰符限制的引用变量)。