思考:java - 静态方法为什么不能调用非静态的成员

从 Java 语言的层面讲,静态方法和实例方法的本质区别在于是否是对象所共享的。而从 JVM 的角度来看,方法(无论静态方法还是实例方法)其实都是对象共享的,实例变量才是对象私有的。对 JVM 而言,静态方法和实例方法的本质区别在于是否需要和具体对象关联:静态方法可以通过类名来调用,它不需要和具体对象关联;而实例方法必须通过对象来进行调用,它需要和具体对象关联。那么,实例方法和具体对象是如何产生关联的呢?其实很简单,编译器在编译时会将方法接收者作为一个隐含参数传入该实例方法,这个参数在方法中有一个很熟悉的名字,叫做 “this”。之所以实例方法可以访问该类的实例变量和其它实例方法,正是因为它有 “this” 这个隐含参数。举个例子,类 A 中的某个方法 b 需要访问实例变量 x,由于实例变量是对象私有的,如果 b 是静态方法,由于它没有具体对象的引用,它并不知道该访问哪个对象的实例变量 x;如果 b 是实例方法,通过隐含参数 this 就能确定要访问的实例变量是 this.x。那么,为什么静态方法也不能调用该类的实例方法呢?本质原因也是没有 this 引用。因为调用实例方法的前提是要传入一个隐含参数,实例方法本来就有这个引用,所以能够把它作为隐含参数传入另一个实例方法;静态方法没有 this 引用,无法给实例方法提供指向方法接收者的隐含参数,因此不能调用实例方法。

你可能感兴趣的:(思考:java - 静态方法为什么不能调用非静态的成员)