Почему доступ к приватному полю не запрещен? - PullRequest
4 голосов
/ 24 января 2010

Для учебы в университете я вынужден сделать некоторые уродливые основы Java, такие как работа без инкапсуляции, основной метод в том же классе и т. Д. (Я не хочу открывать обсуждение руководства по стилю Java, просто хочу уточнить, что я бы не писал что-то подобное за пределами университета)

Я наткнулся на поведение, которое я не могу объяснить себе:

public class Person {
  // fields
  private int age;

  public static void main(String[] args) {
    Person foo1 = new Person();
    foo1.age = 40;
    System.out.println(foo1.age);
  }
}

Почему этот кусок кода компилируется и запускается без ошибок? Как я могу получить доступ к приватному полю? Странное поведение из-за наличия основного метода в одном классе?

Ответы [ 6 ]

17 голосов
/ 24 января 2010

Поскольку статический метод main является членом класса Person и, таким образом, может обращаться к любым закрытым полям или методам в Person.

О чем ты беспокоишься? Кто-то напишет класс, а затем сможет получить доступ к этим методам из своего собственного класса?

Если вас что-то беспокоит, учтите, что вы можете получить доступ к закрытым полям в любом классе, используя отражение, но даже это необходимо для многих полезных вещей.

15 голосов
/ 24 января 2010

Да & ndash; в Java частным является класс закрытым не является частным экземпляром.

Многие другие языки используют экземпляр private, например, Ruby и Smalltalk.

2 голосов
/ 24 января 2010

Поскольку ваш основной метод находится в одном классе, а переменная экземпляра имеет частный доступ, он доступен только для методов того же класса. не существует модификатора доступа, который может ограничивать методы одного и того же класса для доступа к его переменной-члену. это то, что здесь происходит. если у вас есть метод main в каком-то другом классе, хотя в том же пакете он не скомпилировался бы.

1 голос
/ 24 января 2010

Вы можете получить доступ к закрытым полям из своего класса. В этом смысл их определения для каждого класса.

0 голосов
/ 26 января 2010

Поскольку ваш метод main(String[] args) определен внутри класса Person. Если бы метод был определен вне класса Person, вы бы не смогли этого сделать.

0 голосов
/ 24 января 2010

Вы можете написать любой другой статический метод в классе Person и получить доступ к закрытым переменным из этого метода. Main это просто имя. Такова жизнь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...