java- "новый" оператор в статическом методе - PullRequest
0 голосов
/ 13 декабря 2018

Я знаю , это - это ссылочная переменная, которая содержит ссылку для загрузки объекта и статического метода, когда загрузчик класса впервые обращается к классу, либо для создания экземпляра, либо для доступа к статическому методу или полю.Почему это не разрешено для this, но для самого себя?Например,

Class A{
   public static void main(String... args){
      this.method(); //not allowed
      new A().method(); //allowed, how?
   }
   void method(){
      System.out.println("Class A");
   }
 }

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

static переменные и переменные экземпляра следуют порядку инициализации, который вы упоминаете, когда они инициализируются в своих объявлениях.Кроме того, статические блоки инициализатора следуют этому порядку.

Методы (включая конструкторы ), с другой стороны, не требуют инициализации во время выполнения.Они полностью определены во время компиляции и поэтому существуют и могут быть вызваны, как только класс будет загружен, также до завершения инициализации.Поэтому в вашем методе main нет проблем с созданием экземпляра класса (вызовом конструктора по умолчанию) и вызовом метода, который объявлен позже, так как method объявлен ниже main.

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

0 голосов
/ 13 декабря 2018
this.method(); //not allowed

У вас нет экземпляра this в статическом контексте, поэтому вы не можете вызвать метод.

new A().method(); //allowed, how?

У вас есть экземпляр, созданный оператором new, чтобы вы могли вызвать метод.

Чтобы вызвать метод без реального экземпляра, вы должны объявить его как статический.то есть:

static void method(){
  System.out.println(“Class A”);
}

это будет работать при вызове просто method() и через экземпляр:

public class A {
    public static void main(String[] argv) {
        method(); //works because method is static
        new A().method(); //still ok, we can call static method using an instance
        this.method(); //not allowed, there is no 'this' in static context
    }

    static void method(){
        System.out.println("Class A");
    }
}
...