这个问题我问过,原来的问题是:“问一个一贯来可能是错误认识的问题,类在编译后还存在吗?”
上次问题小菜鸟和大花猫领会我的意思了,我原来的意思是不论c++还是java中的类都是源程序级的概念,编译后就不再随二进制程序存在了,剩下的只是编译时由类生成的对象体了,但后来又觉得没有类这摸板,对象怎么能在运行时多次生成和销毁呢,由此才产生这个问题。
不过既然类是要随编译后的程序存在的,那么问题又来了,就象如上说的,对象是可以在程序运行时根据需要多次动态生成和销毁的,这说明必须要有类文件作为生成依据,如果问题真是这样,说明程序在每次需要生成对象时都要有一种机制去解读或说扫描类文件以便生成对象,是不是这样呢?如果是那么这种机制又在哪里?是不是存在于new语句或是构造函数里,即编译系统在它们的二进制代码里自动包含了这样的扫描类文件的代码结构,只是我们看不出而已,是这样吗?
------解决方案--------------------
这个问题不是几句话能说清楚的。看看jvm方面的书会有些帮助。
在jvm加载一个类的时候(不一定是new)它会对要加载的类作很多的工作,主要为:
Loading(把.class文件加载到内存)、
Linking(让类具备正确的运行时状态)、
Initializing(调用初始化方法clinit,这个方法是不是很熟悉^_^,新手调试的时候经常报这个方法出错。这个方法是由jvm调用的,程序员无法调用哦)。做了这些工作后类的信息就会被存储在常量池表中,以后每次要用的时候直接到常量池表中拿就是了。
二进制代码里确实都包含了这些信息(不包含就报错了^_^),但不会每次都扫描,同一个jvm用同一个ClassLoader只会加载一次。