关于Java多态的理解疑惑 多态 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Father1 father1 = new Son1();father1.show1();father1这个引用的类型是Father1,至于实际对象是什么类型是在运行期才能够确定的,而不是编译期确定的,所以如果你调用show2方法,当然不行,编译通不过啊,编译器并不知道你这个引用实际指向什么类型啊。但是你可以强制类型转换是可以的。例如:((Son1)father1).show2(); Son1 extends Father1所以Son1中的方法show1()就相当于是重写了父类的方法、show2()是Son1中自己独有的方法、 难道你要让 编译器 遇到一个类时 要一直检查 他的子类 再子类 再在子类。。吗? 看看他们到底有什么方法吗?然后 在检查一下他是不是 一个子类的引用 然后确定他到底有多少方法吗? 如果这样 那编译器得做多少工作啊 。不管他是不是一个子类的引用 他都不会去 看看他的子类有什么方法的 他只会检查他有什么方法 他继承了他父亲的什么方法 他爷爷的方法就像你能了解你父亲,你爷爷,你的十八代祖宗的一生 但你却不能了解你儿子,你孙子的一生(除非白发人送黑发人 ,这也太例外了吧 ,java 也不可能考虑这例外吧)...... 一楼正解,编译时看的是引用的声明,像Father1 father1 = new Son1();编译器只会知道father1的声明类型是Father1,找方法也在Father1中找,所以Father1中有show1方法,故father1.show1()调用成功,但是Father1中没有show2方法,故father1.show2()编译出错。至于father1.show1()最终调用的是子类的show1方法,则就是动态绑定的问题。动态绑定:运行时自动确定调用哪个方法的现象。动态绑定调用的全过程:(如果方法为private,final,static则采用静态绑定,编译时已经索引好具体调用的地址)- 编译器查看对象的声明类型和调用的方法名,然后一一列举出声明类型和该类型的超类中同方法名的所有方法(超类中的需要是public属性的);- 根据调用方法的参数,选择合适的一个函数(合适指的是类型完全相同或者自动转换类型后符合)。如果没找到那么直接报错。- 虚拟机确定对象的实际类型,寻找该类型下的合适方法调用,如果没找到则到超类中去找。 Father1 father1 = new Son1();father1.show1();father1是Father1型的,在Father1中没有show2()方法,当然找不到啦,就这么简单 一段罕见的EJB调用报错AppSetRollbackOnlyException 这个圆为什么不出来? io输入输出的问题,还有键盘输入时,如何区分各种类型? List 循环空指针问题 js传值问题 请问怎么在PANNEL面板中加字啊? 随机数问题,请各位帮帮忙!!! 我是新手^_^问题比较^_^ 字符串做contains()比较时,怎么不区分大小写 java中的内部类在调用.getClass()时为什么是class java.lang.Class 加急,纠结,求代码大神将以下代码封装成公共函数的形式,然后供外界直接调用 Jaxb2 问题
father1.show1();father1这个引用的类型是Father1,至于实际对象是什么类型是在运行期才能够确定的,而不是编译期确定的,所以如果你调用show2方法,当然不行,编译通不过啊,编译器并不知道你这个引用实际指向什么类型啊。
但是你可以强制类型转换是可以的。例如:((Son1)father1).show2();
就像你能了解你父亲,你爷爷,你的十八代祖宗的一生 但你却不能了解你儿子,你孙子的一生(除非白发人送黑发人 ,这也太例外了吧 ,java 也不可能考虑这例外吧)......
至于father1.show1()最终调用的是子类的show1方法,则就是动态绑定的问题。
动态绑定:运行时自动确定调用哪个方法的现象。
动态绑定调用的全过程:(如果方法为private,final,static则采用静态绑定,编译时已经索引好具体调用的地址)
- 编译器查看对象的声明类型和调用的方法名,然后一一列举出声明类型和该类型的超类中同方法名的所有方法(超类中的需要是public属性的);
- 根据调用方法的参数,选择合适的一个函数(合适指的是类型完全相同或者自动转换类型后符合)。如果没找到那么直接报错。
- 虚拟机确定对象的实际类型,寻找该类型下的合适方法调用,如果没找到则到超类中去找。
father1.show1();father1是Father1型的,在Father1中没有show2()方法,当然找不到啦,就这么简单