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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

那位大神指点一下,为啥静态方法只能访问静态成员呢?????????

14 个回复

倒序浏览
首先你可以这么想,这就是.netframework的游戏规则。静态方法和静态属性,是在你第一次使用这个类的时候加载到内存中,并且以后都不会消失(理论上),除非程序关掉。而非静态成员必须存在于一个实例化的对象中。也就是必须new一个对象分配到堆中后它才存在。你在没有new对象之前它都不存在,你怎么去访问它?
回复 使用道具 举报
规定吧 没有探究这个
回复 使用道具 举报
是看的jvm的加载顺序和生命周期
回复 使用道具 举报
二楼正解,不过一般指的是直接调用,如果事先新建好了对象,再按“对象引用.方法”来调用的话,是可以访问非静态成员的
回复 使用道具 举报
因为静态成员优先于非 静态成员存在
回复 使用道具 举报
静态方法和静态成员存放在方法区,第一次使用这个类时就加载到内存。
而非静态方法和成员使用的时候需要new一个对象,用对象调用。
在new对象之后才会存在于内存中。
如果用静态方法调用非静态成员的话,可能内存中还没有对象没有这个成员,也就会出现错误。
所以静态方法只能调用静态成员。
回复 使用道具 举报
ARD 初级黑马 2015-6-14 22:58:08
8#
这么想行了 首先java编译的时候是在内存中加载静态方法,或者静态变量,如果你没new一个对象 是没有普通变量的,所以静态的方法 访问非静态变量编译会失败的 ,反之非静态的方法访问静态变量或者方法就不会出现这个问题.因为静态的方法或者变量是随着类的加载而加载在内存中的,
回复 使用道具 举报
二楼讲的很详细
回复 使用道具 举报
好像是那样
回复 使用道具 举报
1,静态是随着类的加载而加载
回复 使用道具 举报
1,静态是随着类的加载而加载
2,非静态是随着对象的创建才会能实现的
3,如果此程序没创建好该对象,你静态方法去访问非静态成员,会编译失败的

总结:所以静态方法只能访问静态成员。
回复 使用道具 举报
楼下解释让我丰富了许多
回复 使用道具 举报
因为非静态是依赖于对象而存在的,也就是说只有创建了对象才能调用非静态方法和属性。这个是一个类加载顺序的问题,静态是随着类的加载而加载的,而这个时候构造函还没加载,也就是还没有创建对象,这个时候在静态里面调用非静态的就会报错
回复 使用道具 举报
学习了,赞一个
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马