黑马程序员技术交流社区

标题: 为什么静态方法只能访问静态成员????????? [打印本页]

作者: yijian2033    时间: 2015-6-14 21:09
标题: 为什么静态方法只能访问静态成员?????????
那位大神指点一下,为啥静态方法只能访问静态成员呢?????????

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

总结:所以静态方法只能访问静态成员。
作者: 给点正能量    时间: 2015-6-16 08:31
楼下解释让我丰富了许多
作者: 孟茹    时间: 2015-6-16 09:20
因为非静态是依赖于对象而存在的,也就是说只有创建了对象才能调用非静态方法和属性。这个是一个类加载顺序的问题,静态是随着类的加载而加载的,而这个时候构造函还没加载,也就是还没有创建对象,这个时候在静态里面调用非静态的就会报错
作者: yang9876q    时间: 2015-6-16 09:28
学习了,赞一个




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2