static修饰的成员是类成员:其调用可以用“类名。成员名”“对象名。成员名”这两种方式调用无差别。
非static修饰的成员是实例(对象)成员:其调用必须用“对象名。成员名”调用。
只要你使用上述方法去调用,无论你是在“static调用非static,还是在非static调用static,static调用static,非static调用非static”,都是可以的,而且是最标准的。(注:有得书上写static不能调用非static这句话的前提是同一个类内的直接调用,我本人不建议直接调用非static成员)
关于调用强调
非static调用非static若为同一个类的内部成员也可直接调用不必加对象名,但和加对象名的在内存中是有区别的;

哎又说多了。总之牢记:无论在任何地方只要:static用“类名。成员名”调用,非static用“对象名。成员名”就不会错。语法就这样。

如果非要进一步:static成员属于类,非static成员属于对象(想理解这句话要更进一步)
更进一步,那就到java运行时内存分布了:
java 运行时内存分为堆,栈,方法区(还有寄存器,和本地方法栈,这两个用不到,除非你开发JVM)。一个class文件类加载后就放到了java运行时的内存区里,怎么放的如下:
类刚被加载时所有类的信息都放入方法区(也叫永久区,也就是永远存在的区),方法区里有常量池用来存放 常量 包括String常量,其他的(包括所有的修饰符啦,标示符啦方法代码了等等)也都放在方法区,总之类class被放在方法区。
这也就是说所有的类信息都在方法区,同时方法区会为常量,Static变量开辟额外空间存储其数值(非Static方法内的变量方法区内只存储其代码(方便理解叫代码,其实应该叫字符),其值是存在栈内)。
堆内存储的是对象(书上写的),严格意义上说,堆存储的是每个类非Static变量(类的实例成员属性)的值,和一个指向生成该对象的类的指针(目的指向类Static变量和常量池,这也是为什么static可以“对象名。成员名”调用的原因),一些指向其他对象的指针(对象不能嵌套,多维数组的相关语法来源于此)。因为方法区没有指针指向堆,所以非static成员你不能用类名。成员名调用。

posted on 2012-11-23 15:06  ̶G̶a̶v̶i̶n̶  阅读(1815)  评论(0编辑  收藏  举报