【问题标题】:Java determine which class an object isJava确定对象是哪个类
【发布时间】:2012-02-06 10:39:38
【问题描述】:

我有三个类(CarnivoreHerbivorePlant)扩展了另一个类(Organism)。如何判断对象属于哪个子类?到目前为止,我有一个具有类名称的属性,但我认为可以使用类似于 javascript 的 typeof 的运算符。 (类似于:Organism typeof Carnivore

【问题讨论】:

    标签: java oop class object


    【解决方案1】:

    您可以使用instanceof 关键字。

    但是,请注意,需要使用它通常是糟糕设计的标志。您通常应该在每个派生类中编写方法覆盖,这样您就不需要明确地检查某个类是什么。

    【讨论】:

    • 好的,instaceof 工作。不过,这似乎效率低下。编写几种方法只是为了适应在处理不同类型的生物体时所需的微小变化。
    • @ConnerRuhl:听起来您已经发现了多态性,尤其是虚拟方法的用途。
    • @ConnerRuhl:不过,这几乎就是多态性的意义所在。行为上的任何差异都应该用被覆盖的方法来表达。
    • 所以我必须重写一个包含 75 行代码的方法,只是为了让我的一行代码对每种类型的生物体都不同?它看起来很笨重。
    • @ConnerRuhl:希望不会。您应该找到一种仅将差异表示为覆盖方法的方法。参见例如template pattern.
    【解决方案2】:

    您可以说if( animal instanceof Carnivore ) 来确定它是Carnivore 还是它的后代,您可以使用if( animal.getClass() == Carnivore.class ) 来找出它是否正是Carnivore 而不是它的后代.

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

    【讨论】:

    • @cHao 我用“和 not 它的后代”更新了我的答案。谢谢。
    【解决方案3】:

    Java 有一个instanceof 运算符。但是,这种类型的东西可能与面向对象的设计相反。

    【讨论】:

    • 1+ 表示“那种类型的东西可能违反面向对象的设计。”
    • 我想根据我最喜欢的 MP 短语为你的用户名投票。
    • Oli 的回答也注意到了这一点,一般来说,一个好的面向对象设计会使用多态性,这样行为的差异就在每个子类中,而在某些控制器类中不是即检查对象的类型。
    【解决方案4】:

    您可以使用instanceof 运算符

    【讨论】:

    • if (Organism instanceof Carnivore) {}
    • final Organism organism = new Carnivore(); if(organism instanceof Carnivore){ .... }
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      看看instanceof运营商

      http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html

      请注意,虽然很多人认为使用它可能被认为是危险的,但他们甚至与GOTO相比,但它还不错in some cases。你可以使用它,但不是很频繁。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-16
        • 2017-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多