- 如果要使用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))...
- 我们比较对象的类型的时候一般有四种方法
- 用instanceof操作符
- 使用Class的inInstance()方法
- 使用“==”运算符来判断对象的Class
- 使用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()方法判断的时候则是比较的是这个类是不是某种确切的类型