类
- 定义:类是事物的描述,包含一些类型变量和方法。我们写代码时的class就是类。
实例对象
- 定义:实例对象就是类的具体实现,对于java,就是通过new方法,开辟一块内存,new出来的实例。
- 根据Class对象,生成多个对象实例
Class对象
- 定义:Class对象是jvm生成用来报存对象的类的信息的。
- jvm中只有一个Class对象
- java程序执行前需要经过编译、加载、链接和初始化这几个阶段,编译阶段,会将源文件编译为.class文件,编译器同时会在class文件中生成class对象;加载阶段,通过jvm类的加载机制,将class对象加载到内存中。在创建对象实例前,jvm会先检查Class对象是否在内存中,如果不存在,则加载Class对象,然后再创建对象实例。如果存在,则直接根据Class对象创建对象实例。
Class对象的获得
类名.class
- 获取方式:jvm会进行判断,如果Class对象已经加载到jvm中,则直接获取;如果没有加载,则jvm会先加载Class对象到jvm中,再获取;在这个过程中,不会进行类的初始化。
public class Name {
static int count = 0;
static {
count++;
System.out.println("Name class load! count = [" + count + "]");
}
public Name(){
System.out.println("Name Constructor called!");
}
}
public class ClassTest {
public static void main(String[] args) {
Class test = Name.class;
System.out.println("classTest:"+test);
}
}
测试结果:
classTest:class com...aa.Name
class.forName()
- 在加载class.forName()时,jvm会判断Class对象是否在内存中,如果在,则直接获取;如果不在,则先将Class对象加入内存,再进行获取。在这个过程中,会对类进行初始化,即加载类的静态代码块。
- 示例
public class ClassTest {
public static void main(String[] args) throws ClassNotFoundException {
Class test = Class.forName("com.*.*.aa.Name");
System.out.println("classTest:"+test);
}
}
执行结果 Name class load! count = [1] classTest:class com...aa.Name
会执行static中的内容,进行初始化