关于java中父类引用子类实例化的问题

相信很多人,对于这个问题多多少少会有些疑惑,也可能曾经纠结过,我也上网查找了一些资料,看到知乎上一个人的解释倒是生动形象,

网址链接:http://www.zhihu.com/question/20627883

以下为摘录:

————————————————————————————————————————————————————————————————————————

有一次平原君说:「我要一匹马」,公孙龙给他牵来一匹白马,平原君很高兴,赏给他金子。

后来又有一天,平原君说:「我要一匹白马」,公孙龙给他牵来一匹五花马。平原君震怒,喝令卫士把公孙龙拖出去揍一顿。

公孙龙哭着求饶说:「WhiteHorse 是 Horse 的 sub class,那 WhiteHorse aHorse = new Horse() 咋不行呢,五花马也是马啊?!」

平原君怒道:「
WhiteHorse aHorse = new Horse();
aHorse.runOnSnowWithoutBeingSpotted();
编译时过不了!

WhiteHorse aHorse = (WhiteHorse)(new Horse());
aHorse.runOnSnowWithoutBeingSpotted();
运行时抛异常!

给我重重地打!


……

公孙龙常常能胜人之口,却不能服编译器之心,间接地导致赵国在 DuckType 之战中大败于用 Python 的秦国……这些都是后话了。

———分割线———

笑话比较拙劣,抱歉。例子未经验证,很可能最后一段在编译时也过不了。中心思想就是,类型 B 所指的那一小块内存其实是个 A,里面并没有 B 应该包含的数据。如果不小心按照 B 规定的方式去访问这些不存在的数据,计算机会生气。其实说「如果B c可指向 A 对编程来说不是更方便吗」也有道理,不过那样一来 Java 的整个静态类型系统就失去意义了。推广来说,凡是要求你在声明变量的时候指定这个变量的类型的语言,基本都不会允许你用 B 去指 A,虽然你可以从集合论或者模拟自然世界的角度去理解它,但这本质上是个语言设计的理念问题。

——————————————————————————————————————————————————————————————————————

这样的解释确实挺令人信服,也比较容易懂。

同样,也可以这样理解,子类除了包含了父类的所有属性和方法之外,还有他自己的具体的属性和方法,这些事父类没有的,所以父类无法赋给子类(父类有的不够子类);但是,反之却可以,子类比父类多,当把子类赋值给父类时,父类将会是完整的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值