很感谢你的解答,有些书上就是你的这个意思,加载类的时候动态创建Class对象,但是有些书上不是,有些书上说的是每当编写并编译了一个java类后就产生了一个Class对象,保存在同名的.class文件中(包括网上好多都这么说),甚至有些视频就是直接说类对应的Class对象就是类字节码文件(每个字节码文件就是一个Class对象)。 如果是按你说的那个意思: class LoadedClass{ static{ System.out.println(“类LoadedClass载入”); } public LoadedClass(){ System.out.println(“类LoadedClass实例化”); } }
class Test{ public static void main(String[] args){ System.out.println(“以下是通过.class的方式取得LoadedClass类的Class对象”); Class cls=LoadedClass.class; } } 运行结果: 以下是通过.class的方式取得LoadedClass类的Class对象通过“类名.class”方式可以取得Class的对象,由运行结果看出此时静态代码块没有执行,也就是说类并没有加载,那么我们课本上说:Class对象是在加载类时由JVM或者调用类加载器中的defineClass方法自动构造的。此时类并没有加载,按这种说法就说JVM就还没有创建Class对象,但是现在“类名.class”方式取得的Class对象是哪里来的呢?
2.JVM要运行程序就要在jvm中找到执行的指令,没有class对象就没有相应的指令.所有要加载class,把class加载到了JVM就会在JVM的方法区里生成类信息也就是class对象,等你在代码里有new操作时,就会在JVM的堆区里生成一个实例每个new都会有不同的实例.
所以class类的class对象只是一个概念,
JVM会执行该类的静态代码段,动态加载和创建Class 对象楼主这和c++的静态绑定动态绑定是一样的
如果是按你说的那个意思:
class LoadedClass{
static{
System.out.println(“类LoadedClass载入”);
}
public LoadedClass(){
System.out.println(“类LoadedClass实例化”);
}
}
class Test{
public static void main(String[] args){
System.out.println(“以下是通过.class的方式取得LoadedClass类的Class对象”);
Class cls=LoadedClass.class;
}
}
运行结果:
以下是通过.class的方式取得LoadedClass类的Class对象通过“类名.class”方式可以取得Class的对象,由运行结果看出此时静态代码块没有执行,也就是说类并没有加载,那么我们课本上说:Class对象是在加载类时由JVM或者调用类加载器中的defineClass方法自动构造的。此时类并没有加载,按这种说法就说JVM就还没有创建Class对象,但是现在“类名.class”方式取得的Class对象是哪里来的呢?