Статическая ссылочная переменная Java, вызывающая нестатические методы - PullRequest
0 голосов
/ 04 октября 2018
class A{
    void display(){
      System.out.println("hai");
      }
}
class B {
    static A a;
}
class C{
    public static void main(String args[])
    {
      B.a.display();
      // no compile- time error here.why?
    }
}

Также я знаю, что a будет установлен на null во время выполнения.Но должен ли компилятор знать, что мы обращаемся к нестатическому методу через статическую ссылочную переменную?Это дает исключение нулевого указателя при выполнении, но почему компилятор не выдает ошибку.

Означает ли это, что статическая ссылочная переменная ведет себя точно так же, как ссылка на объект, и, таким образом, может вызывать любой метод (статический и нестатический) класса?

Редактировать: Я в основном путаю со статическойправила доступа к полю.По определению статические поля могут напрямую обращаться только к другим статическим полям.Так разве это не включает «вызов» метода, использующего статическую ссылочную переменную?И к display () обращаются до того, как его объект создан.Это действительно?

1 Ответ

0 голосов
/ 05 октября 2018

«Вы продолжаете использовать это слово. Я не думаю, что оно означает то, что вы думаете, что оно означает».

static A a; в вашем коде говорит: «a - это (ссылка на) объекттипа A, который является общим для всех экземпляров класса B. a, неинициализирован. ".

Компилятор не будет иметь никакого контекста, чтобы определить, когда вы собираетесь вызывать статический main()метод класса C, поэтому он не может определить состояние переменной a во время вызова C.main();.Фактически, вы могли бы также легко иметь класс D:

class D
{
    public static void main( String args[] )
    {
        B.a = new A();
        C.main( args );
    }
}

, который сделал бы приведенный выше код полностью допустимым и работоспособным.

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