魏大勋袁弘真人秀 JAVA的多态用几句话能直观的解释一下吗

2019-11-08 20:51:30

不请自来,C++的多态不太清楚。java比较熟悉,就说说咯。用一句话概括就是:事物在运行过程中存在不同的状态。先以教科书般举例说明,下文再举一个花木兰替父从军的例子帮助大家理解.多态的存在有三个前提:1.要有继承关系2.子类要重写父类的方法3.父类引用指向子类对,但是其中又有很多细节需要注意。首先我们定义两个类,一个父类Animal,一个子类Cat。父类AnimalclassAnimal{intnum=10;staticintage=20;publicvoideat(){System.out.println("动物吃饭");}publicstaticvoidsleep(){System.out.println("动物在睡觉");}publicvoidrun(){System.out.println("动物在奔跑");}}子类CatclassCatextendsAnimal{intnum=80;staticintage=90;Stringname="tomCat";publicvoideat(){System.out.println("猫吃饭");}publicstaticvoidsleep(){System.out.println("猫在睡觉");}publicvoidcatchMouse(){System.out.println("猫在抓老鼠");}}测试类Demo_Test1classDemo_Test1{publicstaticvoidmain(String[]args){Animalam=newCat();am.eat();am.sleep();am.run();//am.catchMouse();这里先注释掉,等会会说明//System.out.println(am.name);//这里先注释,待会说明System.out.println(am.num);System.out.println(am.age);}}以上的三段代码充分体现了多态的三个前提,即:1、存在继承关系Cat类继承了Animal类2、子类要重写父类的方法子类重写(override)了父类的两个成员方法eat(),sleep()。其中eat()是非静态的,sleep()是静态的(static)。3、父类数据类型的引用指向子类对象。测试类Demo_Test1中Animalam=newCat();语句在堆内存中开辟了子类(Cat)的对象,并把栈内存中的父类(Animal)的引用指向了这个Cat对象。到此,满足了Java多态的的必要三个前提。---------------------------------------------------华丽的分割线----------------------------------------------------------------------如果再深究一点呢,我们可以看看上面测试类的输出结果,或许对多态会有更深层次的认识。猜一猜上面的结果是什么。可以看出来子类Cat重写了父类Animal的非静态成员方法am.eat();的输出结果为:猫吃饭。子类重写了父类(Animal)的静态成员方法am.sleep();的输出结果为:动物在睡觉未被子类(Cat)重写的父类(Animal)方法am.run()输出结果为:动物在奔跑System.out.println(am.num);//输出结果为10System.out.println(am.age);//输出结果为20那么我们可以根据以上情况总结出多态成员访问的特点:成员变量编译看左边(父类),运行看左边(父类)成员方法编译看左边(父类),运行看右边(子类)。动态绑定静态方法编译看左边(父类),运行看左边(父类)。(静态和类相关,算不上重写,所以,访问还是左边的)只有非静态的成员方法,编译看左边,运行看右边---------------------------------------------------华丽的分割线----------------------------------------------------------------------那么多态有什么弊端呢?有的,即多态后不能使用子类特有的属性和方法。往上面的代码看,子类Cat有一个特有的属性Stringname="tomCat";并且还有一个特有的抓老鼠的方法catchMouse()。但是在测试类(Demo_Test)中,我们尝试调用子类特有的方法catchMouse()和打印子类特有的成员属性Stringname="tomCat";就会报错。am.catchMouse();System.out.println(am.name);原因就是多态的弊端,就是:不能使用子类特有的成员属性和子类特有的成员方法。--------------------------------------------------华丽的分割线----------------------------------------------------------------------如果在代码执行过程中还想使用Cat类中特有的属性Stringname和它特有的成员方法catchMouse()了怎么办呢?那我们就可以把这个父类引用指向了子类对象的家伙am再强制变回Cat类型。这样am就是Cat类型的引用了,指向的也是Cat对象了,自然也能使用Cat类的一切属性和一切的成员方法。classDemo_Test{publicstaticvoidmain(String[]args){Animalam=newCat();am.eat();am.sleep();am.run();//am.catchMouse();//System.out.println(am.name);System.out.println(am.num);System.out.println(am.age);System.out.println("------------------------------");Catct=(Cat)am;ct.eat();ct.sleep();ct.run();ct.catchMouse();}}很明显,执行强转语句Catct=(Cat)am;之后,ct就指向最开始在堆内存中创建的那个Cat类型的对象了。这就是多态的魅力吧,虽然它有缺点,但是它确实十分灵活,减少多余对象的创建,不用说为了使用子类的某个方法又去重新再堆内存中开辟一个新的子类对象。以上。。----------------------------------------------------------分割线------------------------------------------------------------------------啦啦啦,收到这么多赞.很惊讶,举个通俗点的例子吧.花木兰替父从军大家都知道花木兰替父从军的例子,花木兰替父亲花弧从军。那么这时候花木兰是子类,花弧是父类。花弧有自己的成员属性年龄,姓名,性别。花木兰也有这些属性,但是很明显二者的属性完全不一样。花弧有自己的非静态成员方法‘骑马杀敌’,同样花木兰也遗传了父亲一样的方法‘骑马杀敌’。花弧还有一个静态方法‘自我介绍’,每个人都可以问花弧姓甚名谁。同时花木兰还有一个自己特有的非静态成员方法‘涂脂抹粉’。但是,现在花木兰替父从军,女扮男装。这时候相当于父类的引用(花弧这个名字)指向了子类对象(花木兰这个人),那么在其他类(其他的人)中访问子类对象(花木兰这个人)的成员属性(姓名,年龄,性别)时,其实看到的都是花木兰她父亲的名字(花弧)、年龄(60岁)、性别(男)。当访问子类对象(花木兰这个人)的非静态成员方法(骑马打仗)时,其实都是看到花木兰自己运用十八般武艺在骑马打仗。当访问花木兰的静态方法时(自我介绍),花木兰自己都是用她父亲的名字信息在向别人作自我介绍。并且这时候花木兰不能使用自己特有的成员方法‘涂脂抹粉’。-----多态中的向上转型那么终于一将功成万骨枯,打仗旗开得胜了,花木兰告别了战争生活。有一天,遇到了自己心爱的男人,这时候爱情的力量将父类对象的引用(花弧这个名字)强制转换为子类对象本来的引用(花木兰这个名字),那么花木兰又从新成为了她自己,这时候她完全是她自己了。名字是花木兰,年龄是28,性别是女,打仗依然那样生猛女汉子,自我介绍则堂堂正正地告诉别人我叫花木兰。OMG!终于,终于可以使用自己特有的成员方法‘涂脂抹粉’了。从此,花木兰完全回到了替父从军前的那个花木兰了。并且和自己心爱的男人幸福的过完了一生。-----多态中的向下转型----------------------------------------------------------华丽的分割线---------------------------------------------------------------大家记得哈,向上转型向下转型一定是在多态这个前提下哈,否则强制将女儿变成父亲,或者将父亲变成女人,就变成东方不败了,系统此时就会报错非法类型转换。哈哈哈哈哈。另外开发中一般是利用多态声明形式参数,并将创建子类的匿名对象作为实际参数。以上。

上一篇:魏大勋会做饭的男人唱歌 1214周五晚10点CCTV6将播放V字仇杀队这意味着什么表明了什么意图有什么重大意义
下一篇:会家务的男人们魏大勋 Flickr为什么变得不酷了
设为首页 | 保存到桌面 | 网站地图 | 用户帮助 | 用户注册 | 在线投稿 | 广告投放 | 留言反馈
Copyright © 2005-2012 ™ 165163.com.All Rights Reserved. 东阳在线版权所有
地址:浙江省东阳市画水镇华阳 电话:0579-86220017 013509201192 QQ:393614973 互联网ICP备案编号:浙ICP备10046462号
温馨提示:东阳在线所有帖子仅且代表作者本人意见,均不代表本站立场;如转载请注明出东阳在线(www.165163.com),商业用途请联系本站。

东阳E网 金华公安网监
s