每当编写并且编译了一个新类,就会产生一个class对象(被保存在一个同名的.class文件中)。这个class对象和jvm加载新类而生成的class对象有什么关系?既然编译后就生成了class对象,为什么JVM还要再去生成个class对象?java.lang.class类的class对象到底是在编译后生成的(存在.class文件中),还是在JVM加载后生成的?或者说这两个class对象之间有什么样的关系?是同一个class对象吗?
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的指令和类的描述,但存放的方式不同
定义三个类
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) {
//计算电话账单
}本回答被提问者采纳