当前位置: 首页 > 面试题库 >

有关Java多态性和强制转换的问题

范兴文
2023-03-14
问题内容

我有一个C类。E类对此进行了扩展。

E e = new E();
C c = new C();

为什么是

e = (E) c;

经过进一步审查:尽管数字转换的语法与转换对象的语法相同,但仍引起一些混淆。无论如何,上面的代码没有给出编译结果,而是给出了运行时错误-
因此,在某些情况下,可以将类强制转换为子类(否则,代码将无法编译)。任何人都可以给出上述工作原理的例子吗?

并且:

K extends M

K k = new K();

((M) k).getClass()K。这是为什么?它被铸造成更一般的M

假设我在M和K中都实现了doIt()方法。

((M) k).doIt();

给M或K的doIt()?

谢谢!


问题答案:

考虑一个真实的例子:

public class Dog extends Animal

所有的狗都是动物,但并非所有的动物都是狗。因此…

public class Cat extends Animal

仅在相关动物确实是狗的情况下,才能将动物丢给狗。否则,它将迫使宇宙将狗特有的属性(摇摆的尾巴,吠叫等)推断到动物上。该动物很可能是猫,具有它独特的属性(发出刺耳的声音,严格的自我清洁制度等)。如果无法进行强制转换,则在运行时引发ClassCastException。

没有人想要一只狗发出呼pur声。

((M)k).getClass()给出K。为什么呢?它被铸成更普通的M!

您已将k强制转换为M,但是所有类都有一个getClass()方法。k的类始终为K,无论您对它的引用是否为M。如果您将狗扔给动物,然后问它是什么动物,它仍然会回答它是狗。

实际上,强制转换为超类是多余的。狗已经是动物,它拥有动物的所有方法以及它自己的方法。许多代码分析工具(例如FindBugs)会通知您多余的转换,因此您可以将其删除。

假设我在M和K中都实现了doIt()方法。

((M)k).doIt();

给M或K的doIt()?

K的doIt()的原因与上述相同。强制转换在参考上进行;它不会将对象转换为其他类型。

您能否举一个说明何时投放(Dog doggy =(Dog)myAnimal)有意义的示例?

当然可以。想象一下一种方法,该方法接收要处理的动物列表。所有的狗都需要散步,而所有的猫都需要使用鸟形玩具玩耍。为此,我们调用takeForWalk()仅在Dog上存在的play()方法,或仅在Cat上存在的方法。

public void amuseAnimals( List<Animal> animals ) {
    for ( Animal animal : animals ) {
         if ( animal instanceof Dog ) {
             Dog doggy = (Dog)animal;
             doggy.takeForWalk( new WalkingRoute() );
         } else if ( animal instanceof Cat ) {
             Cat puss = (Cat)animal;
             puss.play( new BirdShapedToy() );
         }
     }
}


 类似资料:
  • 那么谁能解释一下这里的区别是什么,为什么java会做这样的设计呢?多谢了。 编辑:一个类似的问题

  • 为什么最后输出的是“WuffRingding”而不是“RingdingRingding”? 为什么最终输出是“颤动”而不是“振铃”?为什么最终输出是“颤动”而不是“振铃”?

  • 我希望将一个< code>int数组转换为一个< code>double数组。 所以,当我有 我想使用,比如说把它作为参数传递给一个方法。 最好的方法是什么? 演员阵容 不工作。 我可以迭代通过: 有没有更好的方法来做到这一点? <代码>系统。arraycopy不起作用——不适用于两种不同基元类型的数组。 注意:在Java和其他一些讨论中,我们看到了将对象转换为数组。 蒂亚。

  • 隐含的强制转换 隐含的 强制转换是指这样的类型转换:它们是隐藏的,由于其他的动作隐含地发生的不明显的副作用。换句话说,任何(对你)不明显的类型转换都是 隐含的强制转换。 虽然 明确的 强制转换的目的很明白,但是这可能 太过 明显 —— 隐含的 强制转换拥有相反的目的:使代码更难理解。 从表面上来看,我相信这就是许多关于强制转换的愤怒的源头。绝大多数关于“JavaScript强制转换”的抱怨实际上都

  • 明确的强制转换 明确的 强制转换指的是明显且明确的类型转换。对于大多数开发者来说,有很多类型转换的用法可以清楚地归类于这种 明确的 强制转换。 我们在这里的目标是,在我们的代码中指明一些模式,在这些模式中我们可以清楚明白地将一个值从一种类型转换至另一种类型,以确保不给未来将读到这段代码的开发者留下任何坑。我们越明确,后来的人就越容易读懂我们的代码,也不必费太多的力气去理解我们的意图。 关于 明确的

  • 问题内容: 尝试使用PowerMock和Mockito执行单元测试时遇到问题。我需要PowerMockito模拟静态方法。 这些是我正在使用的版本: 当我添加注释@PrepareForTest(Graph.class)时,出现以下错误: 我在PowerMock Google官方页面上读到了这与javassist有关。但是我有点迷茫,我不知道该如何解决。 为了以防万一,我还尝试下载Powermock