Есть код и он компилируется:
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
ссылаются на ту же ячейку памяти.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
У меня это не получаетсяВ документации написано, что такая операция недопустима
Я пишу приложение и там необходимо использовать QRМне нужно каким-то образом закинуть в QR 2 сценария:
Можете помочь, пожалуйстаЯ не знаю, как изменить код, чтобы не было этой ошибки