在《java编程思想》第5章 5.4 讲this关键字的时候,我注意到一句话
——“如果有同一个类型的两个对象,分别是a和b。你可能想知道,如何才能让着两个对象都能调用peel()方法呢”
Class Banana{
void peel (int i){/*....*/}
}
当时看到这句话不知道它为什么会这么问,当时觉得理所当然的每个对象自然会调用自己对象内部所对应的方法,但是其实java虚拟机 的内部并非如此,所以才有如此一问。
java虚拟机的内部结构以及运行方式不再赘述。以后会编辑把关于java虚拟机的一些文章加在这里
java的对象是存在于堆(heap)中的,但是其实对象内容中并不包含如上面代码中的peel这种方法,因为对于多个对象来说放置相同的方法在每个对象里面是十分浪费的,java虚拟机的设计者从开始并没有打算这样放置,这个是我个人以前一直有的一个错误概念。
这个方法在被编译后应该以指令的形式被保存在内存中,当对象调用时会将自身引用带入这个方法中,这个方法会利用此引用取得此对象里面的其它的域或者其它方法的调用。
static的方法或者static的域,其实就是没有this引用的方法和不依赖于this就可以存在的域,这种方法以及域的存储显然不应该和非静态的东西在一个地方。他们在类被加载的时候就被初始化了,并不等待对象在堆栈上被初始化出来,更不需要它的引用。