2012-12-14 115 views
10

我只是好奇地问这个,也许它是相当无意义的。Java实例与类名

当我们使用Java中的instanceof,如:

if (a instanceof Parent){ //"Parent" here is a parent class of "a" 
} 

为什么我们不能象下面这样使用:

if (a instanceof Parent.class){ 
} 

请问第二 '的instanceof' 更有意义,从观严格的编程? “Parent”和“Parent.class”有什么区别?

+0

相关http://stackoverflow.com/questions/496928/what-is-the-difference-between-instanceof-and-class-isassignable从 –

+0

相关http://stackoverflow.com/questions/2590640/why-cant -a级可变待传递到的instanceof – PeterMmm

+0

注:第二种方法中,'Parent.class.isInstance(一)'将是适当的检查。 – Vulcan

回答

15

是什么 “父” 和 “Parent.class” 之间的区别?

后者是一个类字面 - 访问Class<Parent>类型的对象的一种方式。

前者是一个类,它是在各种情况下使用的只是名字 - 调用静态方法,构造函数,铸造等

什么时候第二“的instanceof”从的观点更有意义严格的编程?

不作为语言被定义好了 - instanceof作品与一类的名称,从未的表达式。如果你能写

if (a instanceof Parent.class) 

那么我期待你可以写:

Class<?> clazz = Parent.class; 
if (a instanceof clazz) 

...这只是不是它的工作方式。另一方面,Class.isInstance方法,你可以打电话,如果你想。

你是什么摆在首位“严格程序的视图”是什么意思?

1

Parent是一类,所以第二个例子没有更多的意义,第一个。你在问实例是否是类的一个实例,a instanceof Parent是一个非常直接的表达。

Parent.class实例Class,所以即使编制的第二个例子(它不中,instanceof右手本身不能成为一个实例),它不会检查你想要什么去检查。 :-)

0

Parent是一个类型的名称。 Parent.class本质上是一个静态变量,指的是一个对象(具体来说,是一个Class的实例)。你想问一下a是否是Parent类型的一个实例,而不是它是否是一个本身就是某种其他类型实例的对象实例(名字为Class)。

0

当你写Parent.class那么这意味着你正在创建你的父类java.lang.Class对象。 所以if (a instanceof Parent.class){ }这不会为你工作。

有关Class类更多的细节来看看以下链接:
Class

类的类的实例表示正在运行的Java应用程序的类和接口。每个数组也属于被反射作为由与相同的元素类型和尺寸的数目的所有阵列共享一类对象的类。原始Java类型(布尔,字节,字符,短,整型,长整型,浮点,双),并且关键字void也表示为类对象。

0

静态Parent.class成员实际上是一个对象。你可以把它分配给Object类型的变量或键入Class如果你想:

Object o = Parent.class; 
Class c = Parent.class; 

Parent,另一方面是不是一个对象或一个变量:它是一个Type Name,按Java规范。

如果你能做到这一点...

a instanceof Parent.class 

由于Parent.class对象那么你可以可行也可以这样做:

Cat myCat = new DomesticLonghair(); 
a instanceof myCat; 

...这仅仅是愚蠢的。