我知道这是引用变量,当类加载器首次访问该类以创建实例或访问静态方法或字段时,该变量保存对象和静态方法加载的引用。
为什么不允许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");
}
}
答案 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
方法中实例化该类(调用默认构造函数)并调用稍后声明的方法没有问题,因为method
在main
下声明。
此外,main
方法也仅在完成任何静态初始化之后执行。