java继承中,为什么向上转型后无法运行子类中特有的方法?
看了这篇文章:
https://www.ibm.com/developerworks/cn/java/j-lo-polymorph/
有一些疑问。
class Person {
public String toString(){
return "I'm a person.";
}
public void eat(){}
public void speak(){}
}
class Boy extends Person{
public String toString(){
return "I'm a boy";
}
public void speak(){}
public void fight(){}
}
class Girl extends Person{
public String toString(){
return "I'm a girl";
}
public void speak(){}
public void sing(){}
}
//最后这么用的话,
Person girl = new Girl();
girl.speak();
按照作者的说法,girl引用变量指向堆中的 Girl对象,所以运行的时候知道当前对象是Girl对象,找Girl的方法表,
找到后执行。这对于speak方法来说是行得通的。
但是如果这样呢:
girl.sing();
按照作者的说法,去Girl方法表找到sing方法,然后执行。
实际情况大家都知道有错误,编译不通过。
这中间肯定漏了点我不知道的什么?希望可以赐教。
换个方式问也就是:
当发生向上转型的时候,栈和堆中分别发生了什么?
相关阅读:
关于go语言获取远程包的一个小疑问?
ms-dos 命令中的:冒号是用来干么的?
grunt-contrib-connect其他设备访问问题
backbone 如何处理登录页面
这种类似Tab的布局在Python2.7-PyQt4中是如何实现的?
如何使用grunt将less打包成一个文件?
非标准json格式解析的问题
刚学Map容器,联系键与值的联系,但程序中关于freq++ 产生了疑问
checkbox 对齐问题
ios移动端浏览器 滚动时停止js运行,以及css3动画
感觉编程中总是会弄混一些符号,比如斜杠和反斜杠。
关于mysqlcluster集群里memcached同步的问题
android项目目录下总是自动生成 .d 文件
如何将文本中的数据存储到结构数组中?
phantomjs 最新版2.1.1 windows和linux版本不一致
Ebean 使用 setDistinct() 查询的问题
android的 mediaPlayer 暂停后,再start为何重新播放了
为什么 React 的 virtual DOM 比原生的DOM 渲染性能更好?
用React+flux 做开发,ajax是写在哪里好?
php爬虫链接池和链接调度怎么写?