Java中getclass(),.class与instanceof的区别与联系

我们知道在Java中一切都是对象,我们一般所使用的对象都直接或间接继承自Object类。Object类中包含一个方法名叫getClass,利用这个方法就可以获得一个实例的类型类。类型类指的是代表一个类型的类,因为一切皆是对象,类型也不例外,在Java使用类型类来表示一个类型。所有的类型类都是Class类的实例。例如,有如下一段代码:

A a = new A();

if(a.getClass()==A.class)

    System.out.println("equal");

else System.out.println("unequal");

结果就是打印出 “equal”。可以看到,对象a是A的一个实例,A某一个类,在if语句中使用a.getClass()返回的结果正是A的类型类,在Java中表示一个特定类型的类型类可以用“类型.class”的方式获得,因为a.getClass()获得是A的类型类,也就是A.class,因此上面的代码执行的结果就是打印出 “equal”。特别注意的是,类型类是一一对应的,父类的类型类和子类的类型类是不同的,因此,假设A是B的子类,那么如下的代码将得到 “unequal”的输出:

A a = new A();

if(a.getClass()==B.class)

    System.out.println("equal");


else System.out.println("unequal");

因此,如果你知道一个实例,那么你可以通过实例的“getClass()”方法获得该对象的类型类,如果你知道一个类型,那么你可以使用“.class”的方法获得该类型的类型类。


联系 

一般情况下,getclass()方法和class()方法是等价的,都可以获得一个类型名,例如下面的代码:

在比较一个类是否和另一个类属于同一个类实例的时候,我们通常可以采用instanceof和getClass两种方法通过两者是否相等来判断,但是两者在判断上面是有差别的,下面从代码中看看区别:

public class Test

{

public static void testInstanceof(Object x)

{

System.out.println("x instanceof Parent: "+(x instanceof Parent));

System.out.println("x instanceof Child: "+(x instanceof Child));

System.out.println("x getClass Parent: "+(x.getClass() == Parent.class));

System.out.println("x getClass Child: "+(x.getClass() == Child.class));

}

public static void main(String[] args) {

testInstanceof(new Parent());

System.out.println("---------------------------");

testInstanceof(new Child());

}

}

class Parent {


}

class Child extends Parent {


}
  1. 输出:

  2. x instanceof Parent: true

  3. x instanceof Child: false

  4. x getClass Parent: true

  5. x getClass Child: false

  6. ---------------------------

  7. x instanceof Parent: true

  8. x instanceof Child: true

  9. x getClass Parent: false

  10. x getClass Child: true

  11. */

从程序输出可以看出,instanceof进行类型检查规则是:你属于该类吗?或者你属于该类的派生类吗?而通过getClass获得类型信息采用==来进行检查是否相等的操作是严格的判断。不会存在继承方面的考虑;

区别

两者最直接的区别就是,getClass()是一个类的实例所具备的方法,而class()方法是一个类的方法。 
另外getClass()是在运行时才确定的,而class()方法是在编译时就确定了。

例如下面的程序:

class A{

public void func(){

}

}


class B extends A{


}

public class Test {

public static void main(String[] args) {

A a = new A();

B b = new B();

A ab = new B();

System.out.println(a.getClass()+" "+A.class);

System.out.println(b.getClass()+" "+B.class);

System.out.println(ab.getClass());

ab = a;

System.out.println(ab.getClass());

}

}

 输出结果为:

  1. class A class A

  2. class B class B

  3. class B

  4. class A

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值