java-静态方法中的“ new”运算符

时间:2018-12-13 10:45:17

标签: java static new-operator

我知道是引用变量,当类加载器首次访问该类以创建实例或访问静态方法或字段时,该变量保存对象和静态方法加载的引用。 为什么不允许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 :(得分:1)

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");
    }
}

答案 1 :(得分:0)

static变量和实例变量遵循在声明中初始化时提到的初始化顺序。静态初始化程序块也遵循该顺序。

另一方面,

方法(包括构造函数)在运行时无需初始化。它们在编译时已完全定义,因此存在,可以在加载类后立即将其调用,也可以在初始化完成之前调用它们。因此,在您的main方法中实例化该类(调用默认构造函数)并调用稍后声明的方法没有问题,因为methodmain下声明。

此外,main方法也仅在完成任何静态初始化之后执行。