Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java确定对象是哪个类_Java_Oop_Class_Object - Fatal编程技术网

Java确定对象是哪个类

Java确定对象是哪个类,java,oop,class,object,Java,Oop,Class,Object,我有三个类(肉食动物,草食动物,和植物),它们扩展了另一个类(有机体)。如何判断对象属于哪个子类?到目前为止,我有一个具有类名称的属性,但我认为可以使用类似于javascript的typeof的运算符。(类似于:食肉动物的有机体类型)您可以使用instanceof操作符您可以使用instanceof操作符您可以使用instanceof关键字 但是,请注意,需要使用此选项通常是设计不好的标志。您通常应该在每个派生类中编写方法重写,这样您就不必显式地检查某个类是哪个类。您可以使用instanceof

我有三个类(
肉食动物
草食动物
,和
植物
),它们扩展了另一个类(
有机体
)。如何判断对象属于哪个子类?到目前为止,我有一个具有类名称的属性,但我认为可以使用类似于javascript的typeof的运算符。(类似于:
食肉动物的有机体类型

您可以使用
instanceof
操作符

您可以使用
instanceof
操作符

您可以使用
instanceof
关键字


但是,请注意,需要使用此选项通常是设计不好的标志。您通常应该在每个派生类中编写方法重写,这样您就不必显式地检查某个类是哪个类。

您可以使用
instanceof
关键字


但是,请注意,需要使用此选项通常是设计不好的标志。您通常应该在每个派生类中编写方法重写,这样就不需要显式地检查某个类是哪个类。

Java有一个
instanceof
操作符。然而,这种类型的东西可能与面向对象的设计相反。

Java有一个
instanceof
操作符。然而,这种类型的东西可能与面向对象的设计相反。

看看
操作符的实例


请注意,尽管许多人认为使用它可能被认为是危险的,但他们甚至将其与“GOTO”
相比较,但这并不坏。您可以使用它,但并不经常使用。

请查看
操作符的实例

请注意,尽管许多人认为使用它可能被认为是危险的,但他们甚至将其与“GOTO”
相比较,但这并不坏。你可以使用它,但不是经常使用。

你可以说
if(食肉动物的动物实例)
来确定它是食肉动物还是其后代,你可以使用
if(animal.getClass()==食肉动物.class)
来确定它是否确实是食肉动物而不是其后代

但是,您需要执行此类检查的事实通常意味着您的设计中存在缺陷、缺少可重写的方法或类似的东西。

您可以说
if(animal instanceof Carnivore)
来确定它是食肉动物还是其后代,您可以使用
if(animal.getClass()==Carnivore.class)
以确定它是否确实是食肉动物而不是其后代



但是,您需要执行此类检查的事实通常意味着您的设计中存在缺陷、缺少可重写的方法或类似的情况。

objInstance instanceof Carnivore
。这里的对象是您要测试的对象。

食肉动物的对象实例
。这里objInstance是您要测试的对象。

if(有机体instanceof Carnivore){}
final有机体有机体=新的食肉动物();if(食肉动物的有机体实例){….}
if(食肉动物的有机体实例){}
final有机体=新食肉动物();如果(食肉动物的有机体实例){….}
Ok,则instaceof工作。但这似乎效率低下。编写几种方法只是为了适应在处理不同类型的生物体时所需的一个小变化。@ConnerRuhl:听起来你已经发现多态性的目的,尤其是虚拟方法。@ConnerRuhl:不过,多态性的意义就在于此。行为上的任何差异都应该用重写的方法来表示。所以我必须用75行代码重写一个方法,只是为了使我的代码中的一行对于每种类型的生物体都有所不同?“它看起来太笨重了。”康纳鲁尔:希望不是。您应该找到一种仅将差异表示为重写方法的方法。请参见例如.Ok,instaceof works。但这似乎效率低下。编写几种方法只是为了适应在处理不同类型的生物体时所需的一个小变化。@ConnerRuhl:听起来你已经发现多态性的目的,尤其是虚拟方法。@ConnerRuhl:不过,多态性的意义就在于此。行为上的任何差异都应该用重写的方法来表示。所以我必须用75行代码重写一个方法,只是为了使我的代码中的一行对于每种类型的生物体都有所不同?“它看起来太笨重了。”康纳鲁尔:希望不是。您应该找到一种仅将差异表示为重写方法的方法。参见例如,我用“而非其后代”更新了我的答案。谢谢你们。@cHao我更新了我的答案,“而不是它的后代”。谢谢。1+感谢“这种类型的东西可能与面向对象的设计相反。”我想根据我最喜欢的MP短语投票给你的用户名。Oli的回答也注意到了这一点,一般来说,一个好的面向对象设计会使用多态性,这样每个子类的行为都会有所不同,而不是在一些正在检查对象类型的控制器类中。1+表示“这种类型的东西可能与面向对象的设计相反”。我想根据我最喜欢的MP短语投票给你的用户名。Oli的回答也注意到了这一点,而且总的来说,一个好的面向对象设计将使用多态性,这样行为的差异就出现在每个子类中,而不是在某些检查对象类型的控制器类中。