Почему я могу получить доступ к закрытой переменной из метода main? - PullRequest
9 голосов
/ 16 января 2011
package com.valami;

 public class Ferrari
 {
  private int v = 0;


  private void alam()
  {
   System.out.println("alam");
  }

  public Ferrari()
  {
   System.out.println(v);
  }



  public static void main(String[] args)
  {
   Ferrari f = new Ferrari();
   f.v = 5;
   System.out.println(f.v);
  }

 }

Привет всем! У меня есть один простой вопрос .... ПОЧЕМУ я могу получить приватную переменную из метода main? Я знаю, я нахожусь в сдерживающем классе, но это главное. Я полагал, что основной НЕ является частью класса, который содержит его ... Тогда я бы не стал обращаться к частному члену, но могу ... ПОЧЕМУ? Пожалуйста, помогите ... THX

Ответы [ 7 ]

10 голосов
/ 16 января 2011

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

Также возможно следующее

public class Foo {

    private int a;

    public void mutateOtherInstance(Foo otherFoo) {
        otherFoo.a = 1;
    }
}

Можно спорить, желательно это или нет,но JLS определило, что это законно. Это просто закон жизни.

4 голосов
/ 16 января 2011

Main - это часть вашего класса, вы объявили это внутри своего класса :) То, что main не является частью вашего объекта, оно не будет частью объектов, которые вы создаете из класса, но оно все еще является частью класса. Это верно для любой статической функции, так как main - это просто обычная статическая функция, которую фреймворк знает, что она должна искать при выполнении программы.

/ Viktor

2 голосов
/ 16 января 2011

Метод main находится в классе Ferrari и, таким образом, может получать доступ к закрытым переменным, даже если он статический.

1 голос
/ 16 января 2011

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

1 голос
/ 16 января 2011

Пока приватная переменная находится в том же классе, что и метод main (), метод main () имеет к ней доступ.В общем, даже статические методы имеют доступ к закрытым полям экземпляров одного и того же класса.

1 голос
/ 16 января 2011

Ну, main() - это часть содержащего класса. Фактически, main() точно такой же, как и любой другой метод, за исключением того, что вы можете запустить JVM и указать ему запускать метод main() для класса из командной строки.

0 голосов
/ 16 января 2011

Поскольку main является статическим, а ваш класс не был создан.

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

...