JavaGuide icon indicating copy to clipboard operation
JavaGuide copied to clipboard

关于 “在一个静态方法内调用一个非静态成员为什么是非法的” 一点个人理解

Open daochen23 opened this issue 4 years ago • 4 comments

问题

为什么在静态方法内调动一个非静态的成员是非法的?

我的理解

  • 首先,static 修饰的成员变量和方法是属于类的,它随着类的加载而加载,随着类的消失而消失
  • 而那些非 static 修饰的普通成员变量是属于类的实例的,也就是对象的,它们只有在类的实例化之后才会被加载
  • 所以静态的成员变量和静态方法比非静态的成员变量和方法优先加载

总结

一个优先加载的去调用一个还没有加载的当然是非法的了

daochen23 avatar Mar 13 '21 03:03 daochen23

还有其他理解吗?

zaiweijian avatar Mar 23 '21 09:03 zaiweijian

还有其他理解吗?

这是我的一点理解,更深层的估计就要翻源码了

daochen23 avatar Mar 23 '21 09:03 daochen23

真正的原因是静态代码在元空间,运行时没有this指针,无法索引到实例成员。

1015773611 @.***> 于2021年3月24日周三 下午8:41写道:

说的不错

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/Snailclimb/JavaGuide/issues/1126#issuecomment-805787048, or unsubscribe https://github.com/notifications/unsubscribe-auth/AJICAINNOMXZCTTJLIXSW4DTFHMYLANCNFSM4ZDLOVMA .

-- 亲爱的, 人生有很多意外, 握在手中的风筝, 也会突然断了线。

61go avatar Mar 24 '21 13:03 61go

同意楼上,另外补充一点:字符串常量池还在堆里,只不过运行时常量在元空间。

charlienss avatar Apr 17 '21 16:04 charlienss