A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© a767175432 中级黑马   /  2013-6-16 13:15  /  1068 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

刚开始学面向对象的时候 感觉最难的在于一个问题 就是静态成员不能直接访问非静态成员,但是当时很不理解,所以后面写代码会出现了很多这方面的错误,所以发此贴给大家分享一下

为什么静态成员不能直接访问非静态成员

答 : 非静态成员也就是不被static修饰的属性或者方法等,  而静态成员就是被static修饰的,例如main方法
请看下面代码:
  1. public class A
  2. {
  3. private int a;
  4. public void f()
  5. {
  6. }
  7. public static void g()
  8. {
  9. }
  10. public static void main(String[] args)
  11. {
  12. //a = 10;  这句代码错误
  13. //f(); 这句代码也是错误的
  14. g(); //这句代码是对的
  15. }
  16. }
复制代码
原因是什么呢
因为非静态成员只有在实例化该类对象的时候才会在内存中出现(因为非静态成员伴随着实例产生,也伴随着实例死亡),否则不会出现的,例如上面那段代码 A ademo = new A(); 只有这样a才会在内存中出现

A这个类被加载时首先将被static修饰的成员加载到内存中 所以刚开始main方法和g()方法加载到内存中,所以在main中能直接调用g(),因为g()在内存中已经出现了,
f()和a却没有在内存中出现,在main方法里直接调用没有在内存中出现的成员肯定会出错。
所以这就是静态成员不能直接调用非静态成员,除非将非静态的成员改成静态的在开始时就加载到内存 或者new该类对象
希望对初学者有帮助。。


评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 神马都是浮云

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马