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");
}
}
}
在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("... ...");
}
}
通过以上代码执行的结果,可以得出一个结论:所有的类型类都是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里面的所有的类的类型类都是Class类的对象,比如A.class、B.class都是Class类的对象。
java的设计是通过Class类使得jvm虚拟机能够管理java的类,当一个类被虚拟机装载完毕的时候,就会创建一个Class类的实例,对于类A就是A.class、对于类B就是B.class。