关于Java多态的理解疑惑

问题描述

packagetest;publicclassFather1{voidshow1(){}}packagetest;publicclassSon1extendsFather1{voidshow1(){}voidshow2(){}}packagetest;publicclassFather1VsShow1{publicstaticvoidmain(String[]args){Father1father1=newSon1();father1.show1();//这里就不能按照下方注释的那样去理解了,因为冲突,父类的引用找不到子类的show2方法Son1son1=newSon1();son1.show1();son1.show2();//这里可以调用show2方法,因为根据内存运行图,自己对象里有的,不需要到父类中找}}如注释所说,在不是多态的情况理解,根据画内存图,自己对象里有的,不需要到父类中找相应调用的方法,但在多态情况下,这么理解,就会自相矛盾,因为按照上述代码写的,如果father1.show2()就会报错,father1明明指向的是子类对象,也就是说,在子类对象里是可以找的到show2方法的,但JVM又会报错,说找不到show2方法,这也正是我不理解的地方,请高手指点迷津!

解决方案

解决方案二:
Father1father1=newSon1();father1.show1();father1这个引用的类型是Father1,至于实际对象是什么类型是在运行期才能够确定的,而不是编译期确定的,所以如果你调用show2方法,当然不行,编译通不过啊,编译器并不知道你这个引用实际指向什么类型啊。但是你可以强制类型转换是可以的。例如:((Son1)father1).show2();
解决方案三:
或者你可以用子类重写父类的方法
解决方案四:
Son1extendsFather1所以Son1中的方法show1()就相当于是重写了父类的方法、show2()是Son1中自己独有的方法、
解决方案五:
难道你要让编译器遇到一个类时要一直检查他的子类再子类再在子类。。。。。吗?看看他们到底有什么方法吗?然后在检查一下他是不是一个子类的引用然后确定他到底有多少方法吗?如果这样那编译器得做多少工作啊。不管他是不是一个子类的引用他都不会去看看他的子类有什么方法的他只会检查他有什么方法他继承了他父亲的什么方法他爷爷的方法。。。。。。就像你能了解你父亲,你爷爷,你的十八代祖宗的一生但你却不能了解你儿子,你孙子的一生(除非白发人送黑发人,这也太例外了吧,java也不可能考虑这例外吧)......
解决方案六:
一楼正解,编译时看的是引用的声明,像Father1father1=newSon1();编译器只会知道father1的声明类型是Father1,找方法也在Father1中找,所以Father1中有show1方法,故father1.show1()调用成功,但是Father1中没有show2方法,故father1.show2()编译出错。至于father1.show1()最终调用的是子类的show1方法,则就是动态绑定的问题。动态绑定:运行时自动确定调用哪个方法的现象。动态绑定调用的全过程:(如果方法为private,final,static则采用静态绑定,编译时已经索引好具体调用的地址)-编译器查看对象的声明类型和调用的方法名,然后一一列举出声明类型和该类型的超类中同方法名的所有方法(超类中的需要是public属性的);-根据调用方法的参数,选择合适的一个函数(合适指的是类型完全相同或者自动转换类型后符合)。如果没找到那么直接报错。-虚拟机确定对象的实际类型,寻找该类型下的合适方法调用,如果没找到则到超类中去找。
解决方案七:
Father1father1=newSon1();father1.show1();father1是Father1型的,在Father1中没有show2()方法,当然找不到啦,就这么简单

时间: 2024-07-28 15:11:24

关于Java多态的理解疑惑的相关文章

Java多态的使用注意事项_java

Java多态是如何实现的?Java的多态和C++一样,是通过延时绑定(late binding)或者说运行时绑定(runtime binding)来实现的.当调用某一个对象引用的方法时,因为编译器并不知道这个引用到底指向的是变量声明时说明的类型对象,还是该类型子类的对象.因此编译器无法为这次调用绑定到具体的某个方法.只有通过java中的运行时类型识别(RTTI, Runtime type identification)在运行时绑定到具体的方法.下面是一个具体的例子: 复制代码 代码如下: cla

java代码-关于java多态的问题,不是很懂。

问题描述 关于java多态的问题,不是很懂. 在java se中为什么利用父类引用指向子类对象.而不直接new子类呢,这样有什么好处? 解决方案 换句话说,每天到吃饭的点,我们习惯会说,"去吃饭",而不是会说"去吃青椒肉丝盖浇饭".父类相当于一个范围,子类相当于一个具体的. 解决方案二: 昨天看到有关java多态的一篇文章,内容如下文章转自:http://blog.csdn.net/thinkGhoster/archive/2008/04/19/2307001.as

关于java多态的一些问题

问题描述 关于java多态的一些问题 源代码: public class test { public static void main(String args[]) { A a = new B(); System.out.println("a的地址="+a); System.out.println("在a中--------a="+a.a); System.out.print("调用a.get()方法后---------"); a.get(); B

详解Java多态对象的类型转换与动态绑定_java

Java多态对象的类型转换 这里所说的对象类型转换,是指存在继承关系的对象,不是任意类型的对象.当对不存在继承关系的对象进行强制类型转换时,java 运行时将抛出 java.lang.ClassCastException 异常. 在继承链中,我们将子类向父类转换称为"向上转型",将父类向子类转换称为"向下转型". 很多时候,我们会将变量定义为父类的类型,却引用子类的对象,这个过程就是向上转型.程序运行时通过动态绑定来实现对子类方法的调用,也就是多态性. 然而有些时候

浅谈java多态的实现主要体现在哪些方面_java

thinking in java3中的多态 People are often confused by other, non-object-oriented features of Java, like method overloading, which are sometimes presented as object-oriented. Don't be fooled: If it isn't late binding, it isn't polymorphism 按文面翻译 人们总是被jav

对象-java中如何理解这个数据类型 List<Map<String, Object>>

问题描述 java中如何理解这个数据类型 List<Map<String, Object>> 话说我现在只能理解int void string long 等等基本数据类型呢 List> 是一个引用数据类型吗 应该如何理解呢 解决方案 这个变量本质是一个List类型,指定了List中的元素类型是Map ,这个是泛型,但是编译后会泛型擦除还原成List. 解决方案二: 1) 第一层,一个列表,可以用 类似于 list[i] 的方式来访问. 2) 第二层,这个列表中的每个元素都是一

简单的学习了java之后,有些疑惑到底用做些什么最方便

问题描述 简单的学习了java之后,有些疑惑到底用做些什么最方便 我知道java可以跨平台,有时我想写一个windows程序,但是又要打包,所以我感觉这个不是 开发windows的最佳选择,那么,这个语言开发什么是最合适的,我知道安卓使用他开发的 那其他的呢 解决方案 windows桌面程序,当然用微软自己的开发工具,比如VC++和C#最好. android.基于jsp的网站用java 解决方案二: 网站:Taobao.支付宝网站是基于Java的.京东商城也是基于Java的. 系统:各种系统.

在java当中如何理解添加对象到集合

问题描述 在java当中如何理解添加对象到集合 集合是指类的集合还是对象的集合啊,能否举个简单的例子,谢谢解答 解决方案 对象的集合啊. 我们有一个类Dog(狗狗),我们可以这样 AttayList<Dog> list = new AttayList<Dog>(); list.add(new Dog(""史努比"" 1)); list.add(new Dog(""金毛"" 2)); 此时new Dog(

java中如何理解这种初始化类实例的方式,我只懂new的方式

问题描述 java中如何理解这种初始化类实例的方式,我只懂new的方式 java中public boolean setViewValue(Viewarg0,Object arg1){ImageView imageView =(ImageView)arg0 Bitmap bitmap=(Bitmap)arg1}如何理解这种初始化类实例的方式,我只懂new的方式 解决方案 这种构造方法是将 依赖的成员对象作为构造函数的参数传进入来的,而传人时还是需要new的啊. 解决方案二: 这没有什么别的,只是a