Есть код и он компилируется:
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
По моему видению, в методе equals(EqualMeth p), идёт запрос приватного поля p.name, которое не должно быть видимо. Однако компилятор его видит. В дополнении, оператор ==, как известно, проверяет равенство ссылок. Но на выходе, он говорит о том, что имя FQ и EQ равны.
Вопросы: Почему видно приватное поле p.name? Почему компилятор считает что
EQ.name == FQ.name
ведь у них разные (на мой взгляд) ссылки?
private означает скрытие не от других экземпляров того же класса, а от кода в других классах. Попробуйте обратиться к EQ.name/FQ.name в main.
https://docs.oracle.com/javase/specs/jls/se9/html/jls-6.html#jls-6.6
Какие доки? Я в жизни не написал ни одной строчки на языке Java, кроме как в ответах на ruSO. Однако, это именно то, как работает private в тех языках программирования, с которыми я имел дело.
"И прикажите установить на мессере фотоаппаратуру, если вам моего слова мало!"
Капитан Титаренко "В бой идут одни старики"
При создании любой сроки, сначала проверяется, есть ли такая строка в пуле срок.
Если такой нету она туда добавляется, что и произошло когда ты сделал
"EqualMeth EQ = new EqualMeth (" B "),"
Но когда ты создал еще одну переменную
"EqualMeth FQ = new EqualMeth (" B "),"
ты сначала опять полез в тот же пул строк и нашёл там "В" и в этом случае НЕ создал в памяти новую сроку, а использовал уже существующую.
В этом случае при проверке FQ.equals (EQ) FQ и EQ ссылаются на ту же ячейку памяти.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей