使用Java的RTTI(运行时类型信息)要注意的地方

  • 如果要使用Class的应用来构造一个对象的示例, 那么这么对象对应的类必须有一个无参数的构造函数,例如: 

Class ref=XXX.class;
XXX xxxref=ref.newInstance();
//那么在XXX类里面应该有一个无参数的构造函数

             (还要注意这里的ref应该采用泛型来定义,因为newInstance()返回的的是Object类型, 上面的例子需要手动进行类型转换)
  •  instanceof 关键字后面应紧跟 类型的名称  而不是类型的class应用 例如

String t="aaa";
if(t instanceof String )//正确
//if(t instanceof String.class)//错误
  • 判断类型还可以用class的isInstance()方法 ,例如:


String t="ddd";
Class classRef=String.class;
if(classRef.isInstance(t))...


  • 我们比较对象的类型的时候一般有四种方法
  1. 用instanceof操作符
  2. 使用Class的inInstance()方法
  3. 使用“==”运算符来判断对象的Class
  4. 使用equals()方法来判断对象的Class

但是要主要他们的区别,如下面的代码所示

package come.afeiluo;

class A {
}

class B extends A {
}

public class TestClass2 {

	static void compareType(Object o) {
		Class oc = o.getClass();
		System.out.println("identify " + oc);
		System.out.println("object instanceof A "
				+ (o instanceof A));
		System.out.println("object instanceof B "
				+ (o instanceof B));
		System.out.println("A isInstance object " + A.class.isInstance(o));
		System.out.println("B isInstance object " + B.class.isInstance(o));
		System.out.println("A==object " + (A.class == oc));
		System.out.println("B==object " + (B.class == oc));
		System.out.println("A equals object " + (A.class.equals(oc)));
		System.out.println("B equals object " + (B.class.equals(oc)));
	}

	public static void main(String[] args) {
		compareType(new A());
		System.out.println("=======================================");
		compareType(new B());

	}

}

再看一下输出的结果:

identify class come.afeiluo.A
object instanceof A true
object instanceof B false
A isInstance object true
B isInstance object false
A==object true
B==object false
A equals object true
B equals object false
=======================================
identify class come.afeiluo.B
object instanceof A true
object instanceof B true
A isInstance object true
B isInstance object true
A==object false
B==object true
A equals object false
B equals object true

我们可以看到在对类型B进行判断的时候  用instanceof 和isInstance()进行判断的结果是一样的,而 用“==”和equals()方法判断的结果是一样的,这是由于应instanceof 和inInstance()判断的是这个类是某一种类型,或者是这种类型的子类型,而用“==”和equals()方法判断的时候则是比较的是这个类是不是某种确切的类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值