能用一句话说清楚的绝不多说,能从原理讲起的,绝不从表面讲解。
java有两个获得类名的方法getClass()和class(),这两个方法看似一样,实则不然。这两个方法涉及到了java中的反射。.class 用于类 而 getClass()用于对象。.class和getClass()使用java程序可以得到运行时的类,其实得到就是 Class<T> 一个泛型 的 Class对象 T就是你所调用对象的运行时的类 的类型。
反射
所谓反射,可以理解为在运行时期获取对象类型信息的操作。传统的编程方法要求程序员在编译阶段决定使用的类型,但是在反射的帮助下,编程人员可以动态获取这些信息,从而编写更加具有可移植性的代码。严格地说,反射并非编程语言的特性,因为在任何一种语言都可以实现反射机制,但是如果编程语言本身支持反射,那么反射的实现就会方便很多。
联系
一般情况下,getclass()方法和class()方法是等价的,都可以获得一个类型名,例如下面:
class A{
public void func(){
}
}
public class Test {
public static void main(String[] args) {
A a = new A();
System.out.println(a.getClass()+" "+A.class);
}
}
输出的结果为:class A class A
区别:
两者最直接的区别就是,getClass()是一个类的实例所具备的方法,而class()方法是一个类的方法。
另外getClass()是在运行时才确定的,而class()方法是在编译时就确定了。
例如下面的程序:
class Father{
public void showName()
{
System.out.println("Father...");
}
}
class Child extends Father{
public void showName()
{
System.out.println("children");
}
}
Father father = new Child();
System.out.println(Father.class); 结果是 Father
System.out.println(father.getClass()); 结果是Child
Class主要用于反射机制。