Java中class与Class的区别

  • Post author:
  • Post category:java




一.class与Class区别

class是Java中的关键字,如public class Xxx 或者 class Xxx ,在声明Java类时使用。

而Class是一个类。

我们通常认为类是对象的抽象和集合,Class就相当于是对类的抽象和集合。

也可以认为对象是类的实例,类是Class的实例。

下图是对象在堆中的结构图:

在这里插入图片描述

对象的几个部分的作用:

1.对象头中的Mark Word(标记字)主要用来表示对象的线程锁状态,另外还可以用来配合GC、存放该对象的hashCode;


2.Klass Word是一个指向方法区中Class信息的指针,意味着该对象可随时知道自己是哪个Class的实例;

3.数组长度也是占用64位(8字节)的空间,这是可选的,只有当本对象是一个数组对象时才会有这个部分;

4.对象体是用于保存对象属性和值的主体部分,占用内存空间取决于对象的属性数量和类型;

5.JVM规定了对象地址为8的整数倍,这个地方可能需要字节进行对齐


其中Klass Word指向的就是Java中对象使用到的类,类的Class对象,JVM通过这个指针确定对象是哪个类的实例。该指针的位长度为JVM的一个字大小,即32位的JVM为32位,64位的JVM为64位。



二.Class介绍

Class是一个类。如下图,它在java.lang包中。

在这里插入图片描述

它的构造函数是private属性,所以我们不能直接new一个Class对象出来,如下图注释段所说:

“私有构造函数。只有Java虚拟机创建类对象。不使用此构造函数,并阻止生成默认构造函数。”

在这里插入图片描述



三.如何得到Class对象



1.通过getClass()方法获取到Class对象

getClass()方法是Object类的一部分,如下图:

在这里插入图片描述

如果我们已经创建了某个类型的对象,那么我们可以通过getClass()方法来获取该类型的Class的对象:

package Task;
import org.junit.Test;

public class Try0 {
    @Test
    public void toTry() throws ClassNotFoundException {
//        //forName方法:参数为其类的路径
//        Class a = Class.forName("Task.Try1");
//        System.out.println(a);

        //通过对象得到类
        Try1 try1 = new Try1();
        Class b = try1.getClass();
        System.out.println(b);
    }
}

class Try1{

}

测试运行结果:

在这里插入图片描述



2.通过forName()方法获取到Class对象

Class.forName方法是Class类的一个静态方法,如下图:

在这里插入图片描述

所以可以直接通过Class.forName(“类的路径”)获取Class对象:

package Task;
import org.junit.Test;

public class Try0 {
    @Test
    public void toTry() throws ClassNotFoundException {
        //forName方法:参数为其类的路径
        Class a = Class.forName("Task.Try1");
        System.out.println(a);
    }
}

class Try1{

}

测试运行截图:

在这里插入图片描述



3.类.class获得Class对象(类字面常量)

package Task;
import org.junit.Test;

public class Try0 {
    @Test
    public void toTry() throws ClassNotFoundException {
//        //forName方法:参数为其类的路径
//        Class a = Class.forName("Task.Try1");
//        System.out.println(a);

//        //通过对象得到类
//        Try1 try1 = new Try1();
//        Class b = try1.getClass();
//        System.out.println(b);

        //类字面常量
        Class c = Try1.class;
        System.out.println(c);
    }
}

class Try1{

}

测试运行结果:

在这里插入图片描述



四.Class常用方法

package Task;
import org.junit.Test;

public class Try0 {
    @Test
    public void toTry() throws ClassNotFoundException {
//        //forName方法:参数为其类的路径
//        Class a = Class.forName("Task.Try1");
//        System.out.println(a);

        //通过对象得到类
        Try1 try1 = new Try1();
        Class b = try1.getClass();
        System.out.println(b);

//        //类字面常量
//        Class c = Try1.class;
//        System.out.println(c);


        //isInterface方法,判断是否为接口
        System.out.println(b.isInterface());
        //isArray方法,判断是否为数组
        System.out.println(b.isArray());
        //isPrimitive方法,判断是否是基本类型,例如int是基本类型,Integer为包装类
        System.out.println(b.isPrimitive());
        //isAnnotation方法,判断是否为注解,注解如常见的重写注解@Override,我们所用的单元测试@Test注解
        System.out.println(b.isAnnotation());
        //isInstance方法参数是一个对象,判断该对象try1对应的类Try1是否是b的对象
        System.out.println(b.isInstance(try1));
        //getClassLoader方法,获取类加载器
        System.out.println(b.getClassLoader());
        //getSuperclass方法,获取父类信息
        System.out.println(b.getSuperclass());
        //getGenericSuperclass方法,也是获取父类信息
        System.out.println(b.getGenericSuperclass());
        //getComponentType方法,如果b的类型是数组,则获取数组里元素的类型
        System.out.println(b.getComponentType());
        //getDeclaredClasses方法,获取b继承于哪个类
        System.out.println(b.getDeclaredClasses());


        //几个获取name的方法:
        //getName方法
        System.out.println(b.getName());
        //getTypeName方法
        System.out.println(b.getTypeName());
        //getCanonicalName方法
        System.out.println(b.getCanonicalName());
        //getSimpleName方法
        System.out.println(b.getSimpleName());

//        以下还有一些方法只列举出来
//        getTypeParameters方法,获取泛型类中的泛型参数数组
//        getClasses方法,获取Class对象中public修饰的内部类
//        getDeclaredClasses方法,获取Class对象中的内部类,继承成员不包含在内
//        getConstructors方法,获取public修饰的构造函数
//        getConstructor方法,查找对应的构造函数
//        getDeclaredConstructors方法,获取Class对象中的构造函数
    }
}

class Try1 {

}

输出截图如下:

在这里插入图片描述



五.Java反射机制

参考本人另一篇博客:

Java反射机制(初步认识)



版权声明:本文为MrYushiwen原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。