class对象是在编译后生成的(存在同名.class文件中)既然编译后就生成了class对象为什么JVM加载时又生成个

每当编写并且编译了一个新类,就会产生一个class对象(被保存在一个同名的.class文件中)。这个class对象和jvm加载新类而生成的class对象有什么关系?既然编译后就生成了class对象,为什么JVM还要再去生成个class对象?java.lang.class类的class对象到底是在编译后生成的(存在.class文件中),还是在JVM加载后生成的?或者说这两个class对象之间有什么样的关系?是同一个class对象吗?

1.编译时生成的class类是一个文件,用来存储jvm能执行的指令集和类的信息.
2.JVM要运行程序就要在jvm中找到执行的指令,没有class对象就没有相应的指令.所有要加载class,把class加载到了JVM就会在JVM的方法区里生成类信息也就是class对象,等你在代码里有new操作时,就会在JVM的堆区里生成一个实例每个new都会有不同的实例.
所以class类的class对象只是一个概念,追问

JVM把class文件加载到内存中方法区,并在堆区生成了相应的class对象。但是编程思想在解释RTTI是说:每当编写并且编译了一个新类,就会产生一个class对象(被保存在一个同名的.class文件中),在加载的时候也是先查找新类的class对象是否被加载。
这样的话明显这两个class对象不是同一个对象。例如对于A.class文件Class.forName(A) 这里的A应该就是所说的class对象是代表字节码二进制文件的,是用来判断是否被加载用的吧?

追答

是老外写的书被国人翻译的,老外的思想和我们有区别,翻译的水平也有不同.不要尽信书,要有自己的判断和理解.
对于JAVA来说,老外喜欢把其说成是面对象的语言,所以什么都以对象来称呼.他们认为万物皆对象.所以,编译生成的文件也是对象,文件里的内容也是对象,内容是对于不同类的信息描述也是不同的对象等等.
如果非要用对象来解译你的问题,那就是.A.class是一个文件对象,对象的内容是JVM的指令和类的描述信息.Class.forName(A);是一个动作把文件加载到JVM,而JVM加载的一个文件对象,加载后会在方法区里生成一个对象,这个对象是内存对象,其内容也是JVM的指令和类的描述,但存放的方式不同

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-01-02
举例说明下吧:
定义三个类
public class Bill {//省略细节}
  public class PhoneBill extends Bill {//省略细节}
  public class GasBill extends Bill {//省略细节}
  在处理程序里有一个方法,接受一个Bill类型的对象,计算金额。假设两种账单计算方法不同,而传入的Bill对象可能是两种中的任何一种,所以要用instanceof来判断:
  public double calculate(Bill bill) {
  if (bill instanceof PhoneBill) {
  //计算电话账单
  }本回答被提问者采纳
第2个回答  2011-12-13
其实java 中的所有Class跟你的编写程序中的都一样不管是哪里,至于你说的情况因该是在变异前就产生的。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网