三九宝宝网宝宝百科宝宝知识

高手进 java中的多态具体怎样实现

12月21日 编辑 39baobao.com

[如何快速实现雅思听力]如何快速实现雅思听力招数一 走出过去的误区大部分考过雅思听力的考生都会有过这样的观念:听力文章都听懂才能答好题的。不说所有内容都听懂,但至少证80%或者再少点70%能听...+阅读

。。。呵呵哈、充钻就不必了、我的答案 你先试试看、能不能解决、若不能你加我Q、我帮你! Java中的多态允许父类指针指向子类实例。如:Father obj=new Child();(其中Child是Father的子类)。这样就产生了一个问题—— 使用这个父类型的指针访问类的属性或方法时,如果父类和子类都有这个名称的属性或方法,哪一个属性或方法会被调用呢? 最好的办法是实验: class Father { int r; Father() { r=4; } void printname() { System.out.println("I'm father"); } } class Child extends Father { int r; Child() { r=5; } void printname() { System.out.println("I'm Child"); } } public class Test { public static void main(String[] args) { Father obj=new Child(); System.out.println(obj.r); obj.printname(); } } 结果输出: 4 I'm Child 实验证明。属性会访问父类的。方法分访问子类的。 这就是多态了。 不要以为Father obj=new Child();这条语句一定会让obj.printname()指向Chlid定义的printname()。实际上,如果你把Father类中的printname()方法删除,这个程序将编译失败。因为Father中的并没有定义printname()这个函数。多态是晚绑定*(见本文最后的资料)的,在Father obj=new Child();这个语句中,如果Father中没有printname()这个函数,就不会为obj建立一个用于调用printname()函数的指针。所以调用obj.printname()会出错。如果Father中有这个函数。指向printname()函数的指针会被创建。在调用obj.printname()时,不会出错,而且,因为obj指向的是new Child(),是个Chld类的实例。所以调用obj.printname()时调用了Child类中定义的printname()。这就是方法的动态绑定。 那么,刚才说到把Father类中的printname()方法删掉后,obj将无法调用Child类中的printname(),因为obj.printname()会编译失败。那么如果我就是需要调用要怎么办呢?其实虽然obj是Father类型的,但是它指向的是一个Child类的实例。那么可以将obj强制类型转换为Child。再调用printname()方法就可以了。 在上面程序中,把Father类中的printname()方法整个删掉,再将obj.printname() 改成 ((Child)obj).printname()后,编译成功,结果输出: 4 I'm Child 两次输出的结果都是I'm Child。 那么如何可以运行Child类中的printname()来输出“I'm Father”呢? 其实只需要将Father obj=new Child();改成Father obj=new Father();就可以了,呵呵。另一个办法就是将Child类中定义的printname()整个删掉。为什么这样可以成功呢?自己想想,嘿嘿。最后会有个这样的思考题。 看到这儿你可能早就想问了: 为什么obj.r是4?为什么不是5? 呵呵。其实很简单。Java中的多态仅为方法而言,成员变量还是使用的父类的成员变量。也就是说,因为“Father obj =……”,所以obj是Father类型的,所以obj里面的r是Father里面的r,所以输出obj.r就是4了。 你又想问: 那么5去哪了?new Child()的时候,不是会把5放到Child的r中吗? 实际上5还是有的。只是obj.r是4而已。想访问Child中的r,把5读出来,可以这样写: ((Child)obj).r 就是把obj由Father型强制转换成了Child型。 OK,方法和属性在多态中是什么样的你都清楚了。现在做个题测试一下吧: 这是JWhiz1.4的一道题: class Base { int i = 99; public void amethod() { System.out.println("Base.amethod()"); } Base() { amethod(); } } public class Derived extends Base { int i = -1; public static void main(String argv[]) { Base b = new Derived(); System.out.println(b.i); b.amethod(); } public void amethod() { System.out.println("Derived.amethod()"); } } 会输出什么? 先想想,再看答案: 答案: ======================== Derived.amethod() 99 Derived.amethod() ======================== 就上面那个例子 、你好好理解下就可以了!概念就够了!

以下为关联文档:

不怕挫折和失败,我的理想就会实现理想,对于小时候的我来说,是个很空泛的话题。我一会想当这个,一会想当那个,总也确定不下来。但是,我大一点的时候,跟着父母去看了一次画展,我被那些画深深的吸引住了,它们真是太精...

要想成为好父母,必须努力实现六个转变做为家长,多年来我一直在寻求教育孩子的灵丹妙药,也在摸索中逐步形成了自己的一些教育方法。但读完《给孩子最好的家庭教育》这本书,我深感震撼:自己的很多方法都是欠妥甚至是错...

浅议如何实现幼儿园绘本教学中教师的有效提问新西兰儿童文学研究学者罗西·怀特说:“绘本是孩子在人生道路上最初见到的书,是在漫长的读书生涯中读到的所有的书中最最重要的书。一个孩子从绘本中体会到多少快乐,将决定他一...

电子商务是如何实现税收的电子商务实现税收的方式: (一)积极参与制定有关电子商务的法律、法规、制度以及相应的实施细则,与相关部门合作,实施多方监控。 现行的税收法律法规对新兴的网络贸易的约束已显得...

求日语高手把汉字翻译成假名起(お)こったことはもう元(もと)に戻(もど)らない 已经发生的事情是回不到原来的状态的 大事(だいじ)な试験(しけん)に失败(しっぱい)する。眠(ねむ)り运転(うんてん)で车(くるま)をガートレー...

长期股权投资非同一控制下分次实现企业合并问题你好, 很高兴为你回答问题! 解析: 这是分次取得股权最终达到控制的非同一控制下的企业合并,其长期股权投资的初始投资成本就是,购买日之前所持有股权的账面价值与购买日新增投资...

java中实现多态的机制是什么多态很简单,意思就是一个接口,多种方法;多态又分为静态和动态,方法重载属于静态,方法覆盖和继承属于动态,说不清楚,给段代码给你做参考,能不能看懂就看你自己的了,这种事别人帮不了你...

java中实现多态的机制.....看的好复杂。。。 方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性...

java的多态怎么实现这几天我在重新复习Java语言基础,虽然和团队一起,自己个人都进行了实际项目的开发,但越往上面走越觉得自己应该花点时间看看Java的基础知识,巩固一下基础。今天复习的是多态,同时...

推荐阅读
图文推荐