这个问题我问过,原来的问题是:“问一个一贯来可能是错误认识的问题,类在编译后还存在吗?” 
上次问题小菜鸟和大花猫领会我的意思了,我原来的意思是不论c++还是java中的类都是源程序级的概念,编译后就不再随二进制程序存在了,剩下的只是编译时由类生成的对象体了,但后来又觉得没有类这摸板,对象怎么能在运行时多次生成和销毁呢,由此才产生这个问题。
不过既然类是要随编译后的程序存在的,那么问题又来了,就象如上说的,对象是可以在程序运行时根据需要多次动态生成和销毁的,这说明必须要有类文件作为生成依据,如果问题真是这样,说明程序在每次需要生成对象时都要有一种机制去解读或说扫描类文件以便生成对象,是不是这样呢?如果是那么这种机制又在哪里?是不是存在于new语句或是构造函数里,即编译系统在它们的二进制代码里自动包含了这样的扫描类文件的代码结构,只是我们看不出而已,是这样吗?

解决方案 »

  1.   

    我觉得楼主的问题主要在于没有弄清源代码和字节码的关系。他们本质上是一个东西,就是对类的定义。只不过源代码是给人看的,字节码是给机器看的。JVM 读取字节码之后,便会在程序中生成“类”。至于 Java 中面向对象的语法和概念是如何在 JVM 里实现的,建议楼主找找 JVM 实现方面的书。
      

  2.   

    这个问题不是几句话能说清楚的。看看jvm方面的书会有些帮助。
    在jvm加载一个类的时候(不一定是new)它会对要加载的类作很多的工作,主要为:
    Loading(把.class文件加载到内存)、
    Linking(让类具备正确的运行时状态)、
    Initializing(调用初始化方法clinit,这个方法是不是很熟悉^_^,新手调试的时候经常报这个方法出错。这个方法是由jvm调用的,程序员无法调用哦)。做了这些工作后类的信息就会被存储在常量池表中,以后每次要用的时候直接到常量池表中拿就是了。二进制代码里确实都包含了这些信息(不包含就报错了^_^),但不会每次都扫描,同一个jvm用同一个ClassLoader只会加载一次。
      

  3.   

    > 纯语言的,操作系统只认识0和1不是吧?!从 CPU 指令上就区分了 BYTE、WORD、DWORD 等等类型,而且,甚至还区分了有符号/无符号。当然,这个层次上的所谓“数据类型”,跟某种高级语言里的“数据类型”并不是一一对应的,只是大体上有一个对应关系。像 C/C++ 里面,对某种基本数据类型的操作,跟 CPU 指令几乎就是直接对应的。
      

  4.   

    > 不是吧?!从 CPU 指令上就区分了 BYTE、WORD、DWORD 等等类型,而且,甚至还区分了有符号/无符号。cpu指令我倒没研究过,不过内存是由硅组成的。很遗憾,硅只有两种状态。
      

  5.   

    对,我也记得CPU指令就隐含这些功能,感觉基本数据类型应该就是跟这些指令相呼应的,CPU指令里本来就有专门处理数值和字符的指令及长型和短型数据的指令等,这是硬件隐含的。至于结构体、类等抽象数据类型应该就是这些基本类型的叠加。