Что-то эта задача перевернула мое понимание private модификаторов доступа.
Почему вот эта конструкция рабочая, если мы обращаемся в private полю по сути другого объекта:
public static class Soldier implements Comparable<Soldier>{
private int height;
public int compareTo(Soldier o) {
return o.height - this.height;
}
}
?
Или же все прайвет поля видны другим инстансам того же класса?
Викторчег
38 уровень
Доступы к прайвет полям других инстансов того же класса
Решен
Комментарии (6)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Артем Divertitto Senior Android-разработчи в United Tech Master
26 июля 2018, 17:02
Так а обращение к нему внутри самого класса. о этому там можно. А если бы ты так попробовал бы в другом классе, то такая штука не прокатила б
0
Vladimir
25 июля 2018, 16:57
public - глобальная видимость.
private - видимость элементов внутри класса.
protected - видимость внутри пакета и наследникам.
0
Викторчег
25 июля 2018, 16:59
Это все понятно, но не отвечает на вопрос.
Мы в примере обращаемся к прайвет полю по сути другого объекта.
0
Vladimir
27 июля 2018, 15:29
Не объекта, у вас происходит подмена понятий.
Класс - шаблон, по которому происходит создание объекта.
Объект - сущность, которая создается по шаблону.
В данном примере private int height; - переменная класса. У каждого объекта, созданного по этому шаблону, будет своя переменная height.
Если говорить на формальном языке, то класс Soldier описывается так:
Все объекты, созданные по шаблону Soldier, имеют внутреннюю переменную height, к которой могут обращаться только они сами.
Если сделать инициализацию двух объектов:
Мы можем сказать:
Создай нам солдата (объект) first по шаблону Soldier со всеми его внутренними параметрами и методами.
И у first, и у second будет своя переменная height. И они могут ее использовать.
0
Викторчег
27 июля 2018, 15:34
Касательно моего куска кода речь идет именно про обращение к полю другого объекта, а именно к полю height объекта o.
Мне казалось, что прайват автоматом закрывает такие поля и при обращении к другому объекту того же класса в классе, где поле было объявлено как прайват, но это не так.
0
Vladimir
27 июля 2018, 16:10
Эти два объекта родственники, поэтому так можно. Private защищает только из вне класса.
0