刚开始学面向对象的时候 感觉最难的在于一个问题 就是静态成员不能直接访问非静态成员,但是当时很不理解,所以后面写代码会出现了很多这方面的错误,所以发此贴给大家分享一下
为什么静态成员不能直接访问非静态成员
答 : 非静态成员也就是不被static修饰的属性或者方法等, 而静态成员就是被static修饰的,例如main方法
请看下面代码:- public class A
- {
- private int a;
- public void f()
- {
- }
- public static void g()
- {
- }
- public static void main(String[] args)
- {
- //a = 10; 这句代码错误
- //f(); 这句代码也是错误的
- g(); //这句代码是对的
- }
- }
复制代码 原因是什么呢
因为非静态成员只有在实例化该类对象的时候才会在内存中出现(因为非静态成员伴随着实例产生,也伴随着实例死亡),否则不会出现的,例如上面那段代码 A ademo = new A(); 只有这样a才会在内存中出现
A这个类被加载时首先将被static修饰的成员加载到内存中 所以刚开始main方法和g()方法加载到内存中,所以在main中能直接调用g(),因为g()在内存中已经出现了,
f()和a却没有在内存中出现,在main方法里直接调用没有在内存中出现的成员肯定会出错。
所以这就是静态成员不能直接调用非静态成员,除非将非静态的成员改成静态的在开始时就加载到内存 或者new该类对象
希望对初学者有帮助。。
|