欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

class和getClass()

程序员文章站 2022-07-16 22:12:01
...

为了解释这class和getClass()这两个概念,我们创建两个类A和B在同一个test包下,如下:

package test;

public class A {

}
package test;

public class B {

}

下面是我们需要了解的一些java概念

类是java的一种可以自定义的数据类型,和C++一样,C语言的结构体struct同样是可以自定义。java用class表示自定义类类型。比如上面定义的A和B就是类类型。

对象

由类类型创造的实例。比如下面的代码,a就是对象,a是类型A的实例对象。

package test;

public class Main {

	public static void main(String[] args) {
		A a = new A();
	}
}

类型类

 我们知道在Java中一切都是对象,我们一般所使用的对象都直接或间接继承自Object类。Object类中包含一个方法名叫getClass,利用这个方法就可以获得一个实例的类型类。

类型类指的是代表一个类型的类,因为一切皆是对象,类型也不例外,对于类型类来说,类类型就是类型类的对象实例。

package test;

public class Main {

	public static void main(String[] args) {
		
		A a = new A();
		
		if ( a.getClass() == A.class ){
			System.out.println("equal");
		} else {
			System.out.println("unequal");			
		}
	}
}
运行结果是:equal

在java中,用类类型.class来表示类型类,也就是类的类型。对象可以通过getClass()来获取这个对象所对应的类类型的类。

如果按照这种思维往下推,会有类型类的类型类吗,也就是A.class.class存在吗?注意,这种写法是不对的!

package test;

public class Main {

	public static void main(String[] args) {
		
		A a = new A();

		System.out.println(A.class);
		System.out.println(A.class.getClass());
		System.out.println(A.class.getClass().getClass());
		System.out.println("... ...");
	}
}

执行结果:

class test.A
class java.lang.Class
class java.lang.Class
... ...

存在A.class.getClass(),但是不存在A.class.class,上面的代码和下面一样,如下:

package test;

public class Main {

	public static void main(String[] args) {
		
		A a = new A();

		System.out.println(a.getClass());
		System.out.println(a.getClass().getClass());
		System.out.println(a.getClass().getClass().getClass());
		System.out.println("... ...");
	}
}
不存在a.getClass().class写法

通过以上代码执行的结果,可以得出一个结论:所有的类型类都是Class类(java.lang.Class)的实例。

package test;

public class Main {

	public static void main(String[] args) {
		
		A a = new A();
		System.out.println(a.getClass().equals(B.class));
	}
}
不同的类的类型类是不一样的。但是不同的类的类型类的类型类是同一个类java.lang.Class


总结

在java里面的所有的类的类型类都是Class类的对象,比如A.class、B.class都是Class类的对象。

java的设计是通过Class类使得jvm虚拟机能够管理java的类,当一个类被虚拟机装载完毕的时候,就会创建一个Class类的实例,对于类A就是A.class、对于类B就是B.class。