有一个代码,它编译:
public class EqualMeth {
private String name; //Приватное поле
public EqualMeth(String name) { //Конструктор
this.name = name;
}
public boolean equals(EqualMeth p) {
return p.name==this.name; //p.name вроде бы приватно
}
public static void main(String[] args) {
EqualMeth EQ = new EqualMeth("B");
EqualMeth FQ = new EqualMeth("B");
if(FQ.equals(EQ)){
System.out.println("FQ == EQ");
}
else{
System.out.println("FQ != EQ");
}
}
}
在出口处:FQ == EQ
在我看来,在 methodequals(EqualMeth p)
中,有一个对p.name
不应该可见的私有字段的请求。但是,编译器会看到它。此外,已知 == 运算符用于测试引用相等性。但是在输出中,它说名称FQ
和EQ
是相等的。
问题:为什么私有字段可见p.name
?为什么编译器会这么认为
EQ.name == FQ.name
因为他们有不同的(在我看来)链接?
private
意味着不是对同一类的其他实例隐藏,而是对其他类中的代码隐藏。尝试引用EQ.name
/FQ.name
tomain
。什么码头?我一生中从未用 Java 写过一行代码,除了对 ruSO 的回答。然而,这正是它
private
在我处理过的编程语言中的工作方式。蒂塔连科上尉“只有老人才能上战场”
创建任何时间帧时,它首先检查时间帧池中是否存在这样的字符串。
如果没有,则将其添加到那里,这在您添加时发生
但是当你创建另一个变量时
您首先再次进入同一个字符串池并在那里找到它
"В"
,在这种情况下,并没有在内存中创建一个新术语,而是使用了一个现有术语。在这种情况下,当检查
FQ.equals (EQ) FQ
和EQ
引用相同的存储单元时。