Почему видно приватное поле в java коде?

150
18 марта 2019, 12:10

Есть код и он компилируется:

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

ведь у них разные (на мой взгляд) ссылки?

Answer 1

private означает скрытие не от других экземпляров того же класса, а от кода в других классах. Попробуйте обратиться к EQ.name/FQ.name в main.

https://docs.oracle.com/javase/specs/jls/se9/html/jls-6.html#jls-6.6

Какие доки? Я в жизни не написал ни одной строчки на языке Java, кроме как в ответах на ruSO. Однако, это именно то, как работает private в тех языках программирования, с которыми я имел дело.

"И прикажите установить на мессере фотоаппаратуру, если вам моего слова мало!"

Капитан Титаренко "В бой идут одни старики"

Answer 2

При создании любой сроки, сначала проверяется, есть ли такая строка в пуле срок.
Если такой нету она туда добавляется, что и произошло когда ты сделал

"EqualMeth EQ = new EqualMeth (" B "),"

Но когда ты создал еще одну переменную

 "EqualMeth FQ = new EqualMeth (" B "),"

ты сначала опять полез в тот же пул строк и нашёл там "В" и в этом случае НЕ создал в памяти новую сроку, а использовал уже существующую.

В этом случае при проверке FQ.equals (EQ) FQ и EQ ссылаются на ту же ячейку памяти.

READ ALSO
“autoReconnect” must end with the ';' delimiter

“autoReconnect” must end with the ';' delimiter

Есть вот такая проблема :

161
Изменение типа обобщения

Изменение типа обобщения

У меня это не получаетсяВ документации написано, что такая операция недопустима

121
QR содержащий 2 разные ссылки

QR содержащий 2 разные ссылки

Я пишу приложение и там необходимо использовать QRМне нужно каким-то образом закинуть в QR 2 сценария:

127
Error:(52, 25) java: non-static variable this cannot be referenced from a static context

Error:(52, 25) java: non-static variable this cannot be referenced from a static context

Можете помочь, пожалуйстаЯ не знаю, как изменить код, чтобы не было этой ошибки

139