class和getClass()

来源:互联网 发布:linux操作系统下载官网 编辑:程序博客网 时间:2024/05/31 06:23

为了解释这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。



原创粉丝点击