静态方法为何不能调用非静态成员?
我很久以前就知道静态方法不能调用非静态成员,但是从没想过为什么?只知道书上这么说的。
今天忽然想了一下,豁然开朗:
那么静态方法为何不能调用非静态成员?
首先要从静态方法是如何被调用的呢说起? 类名.静态方法();
??????????非静态方法是如何被调用的呢? 实例变量名.非静态方法();
?????????? 实例变量名.非静态方法();???????非静态方法中的this是指代调用此方法的实例变量,(非静态方法中直接调用成员变量或成员方法其实默认是用 this.成员 做替换),this是当前实例变量。既然this是实例变量那么? 类名.静态方法(); 假设静态方法能调用非静态成员,那么静态方法中就可以出现this,既然能出现this,那么this指代什么呢?指代当前类名?
矛盾了吧?所以静态方法不能调用非静态成员。
?
既然提到this,我就多说一句:如果子类实例变量调用父类成员(属性和方法),父类中的this指代该子类实例变量,和上面 “this是当前实例变量”这句话不矛盾吧!
1 楼 cyruscript 2013-10-05 变量只有在内存中占有一席之地时才能被访问.静态方法不能调用非静态成员,原因就是静态成员与非静态成员在内存中被实例化的时机不同。
静态成员在类加载的时候就会分配内存,就已然存在;而非静态成员即对象成员,那得等到对象实例化时才出来,在类加载时是不存在的。那在类加载时去引用一个不存在的成员,当然是不行的。 2 楼 edr_ 2013-10-05 cyruscript 写道变量只有在内存中占有一席之地时才能被访问.
静态方法不能调用非静态成员,原因就是静态成员与非静态成员在内存中被实例化的时机不同。
静态成员在类加载的时候就会分配内存,就已然存在;而非静态成员即对象成员,那得等到对象实例化时才出来,在类加载时是不存在的。那在类加载时去引用一个不存在的成员,当然是不行的。
正解!