我对Java中的类定义有疑问。对于以下代码段,在if
开关已经验证h is an instance of Animal
之后,为什么我们仍然需要添加Animal ob = (Animal) h
行?另外,为什么第二个编码段错了?我知道它应该来自public boolean equals (Animal h)
答案 0 :(得分:2)
Object.equals()
接受Object
类型的对象,因此第二个示例是错误的,因为它需要一个Animal
对象。在第一个中,强制转换是因为变量具有类型Object
,即使它实际上是Animal
类型的实例,因此需要强制转换为类型为{的变量{1}}。
答案 1 :(得分:0)
1 - 您必须与instanceof
核对,因为收到的Object h
可能是任何类的实例,因为在Java中,所有类都自动从Object
类继承。
例如,它可能是Fruit
。如果它是Fruit
,则它不是Animal
。如果您尝试将其强制转换为Animal
,则会抛出ClassCastException
。
这就是为什么在将收到的Object h
转换为Animal
之前,首先检查h
实际上是Animal
类的实例。如果(h instanceof Animal)
的评估结果为false
,则表示h
不是Animal
,因此不会执行转换,也不会抛出ClassCastException
。
演员必须告诉编译器h
实际上是Animal
类的一个实例(到目前为止所有编译器都知道h
是Object
的一个实例1}} class,因为它是方法参数的类型)。这样,您就可以通过h
类的成员访问Animal
的数据。
2 - 第二种方法在技术上是正确的,但instanceof
检查和强制转换都不是必需的,因为收到的Animal h
无法帮助成为Animal
。那么,为什么检查哪些是显而易见的如果该方法被执行,那是因为它是使用静态类型已经为Animal
的参数调用的。因此,在访问h
的字段之前,您需要做的就是检查h
是否不是null
。