加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 为什么在这段代码中有未处理的异常?

发布时间:2020-12-15 05:12:26 所属栏目:Java 来源:网络整理
导读:我来自以下代码: class Animal{ public void eat() throws Exception {}}class Dog extends Animal{ public void eat(){} //no exception thrown public static void main(String[] args){ Animal a = new Dog(); Dog d = new Dog(); d.eat(); //ok a.eat()
我来自以下代码:

class Animal{
    public void eat() throws Exception {}
}

class Dog extends Animal{
    public void eat(){} //no exception thrown
    public static void main(String[] args){
          Animal a = new Dog();
          Dog d = new Dog();
          d.eat();   //ok
          a.eat();  //does not compile!..(1)
    }
}

这里,(1)即使在运行时也不会编译Dog的eat()方法将被调用.为什么会这样? Java支持这个的原因是什么?这不应该是一个bug吗?

解决方法

因为您使用Animal引用来引用Dog. Animal.eat的签名包括Exception.编译器知道Dog是一种Animal,但是一旦你使用Animal引用它就不知道它是一个Dog直到运行时.

换句话说,所有的狗都是动物,但不是所有的动物都是狗.

编辑

你可以添加一个演员

((Dog) a).eat();  //would compile

在运行时,如果a实际上不是Dog,那将失败.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读