当前位置:  开发笔记 > 编程语言 > 正文

为什么声明的对象类型在运行时很重要?

如何解决《为什么声明的对象类型在运行时很重要?》经验,为你挑选了1个好方法。

在Java这样的静态类型语言中,从我所学到的,类型声明主要用于编译时捕获错误,这是一种明显优于动态类型语言的优势.但是看看Java进行后期绑定的时候,我们会得到错误ClassCastException,在运行时以某种方式显示声明的类型是如何相关的.但为什么声明的类型实际上很重要?

例如:

public class TestClass 
{
   public static void main(String[] args) 
   {
       Animal d = new Animal();
      ((Dog)d).bark(); //ClassCastException because an Animal is not a dog, which would make sense to throw at compile-time, but not at runtime.
   }
}

class Dog extends Animal{}

class Animal
{
   void bark()
   {
       System.out.println("Woof");
   }
}

我知道这是一个非常糟糕的例子,因为它是一个无人问津的演员,但我只是举了一个例子.我们总是试图避免运行时异常,那么为什么Java不能忽略bark实际对象类型的强制转换和调用方法,在这种情况下是Animal什么?我一直在阅读有关鸭子打字的内容,看起来这种类似的改编可能适用于Java(即如果这个对象是woofs,那么让它像狗一样对待!)或任何静态类型的语言,因为在运行时,Java似乎动态行动.

编辑:现在我正在考虑更多,这个问题是关于运行时类型检查的需要.为什么需要发生?静态类型语言在可以忽略的转换上暂停运行时异常似乎很糟糕.



1> Sriram Sakth..:

为什么Java不能忽视对实际对象类型的强制转换和调用方法,在这种情况下是动物?

这在语义上是错误的.如果DogAmimal有不同的版本的Bark方法是什么?

假设Bark您的基类中有非虚方法.当你调用BarkDog它应该调用Dog.Bark; 同样,当你调用BarkAnimal它应该调用Animal.Bark.

如果编译器忽视了你所说的强制转换,它最终会调用错误的方法.

请注意,在C#中,默认情况下,所有方法都是非虚拟的,而不是java.所以这个论点在C#的上下文中更有意义.

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有