java的类的Class对象和实例对象

1,364 阅读2分钟

  • 定义:类是事物的描述,包含一些类型变量和方法。我们写代码时的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中的内容,进行初始化