Java中多态详解(参考刘意教程)
目录
1.1多态概述
1.2多态中成员访问的特点
1.3多态的好处和弊端
1.4多态的向上转型和向下转型
1.1多态概述
多态:同一个对象,在不同时刻表现出来的不同形态。使用多态,在程序中定义的引用变量到底会指向哪个类的实例对象在编程时并不确定,要在程序运行期间才能确定。
使用多态,可以不用修改源程序代码,就可以让引用变量绑定到不同的类实现上,从而使得调用的具体方法随之改变,让程序选择多个运行状态,就是多态性。
说明1:猫 Cat = new Cat(); 动物 animal = new Cat();
这里的猫在不同时刻可以是猫也可以是动物,在不同的时刻有不同的形态,就是多态。
说明2:public void eat(animal a){}
动物 animal c = new Cat(); 动物 animal d = new Dog();
这里程序中定义的引用变量不能确定到底会指向哪个类的实例对象,可能是猫,也可能是狗。
多态的前提和体现:
- 有继承/实现(接口实现)关系
- 有方法重写
- 有父类引用指向子类对象
1.2多态中成员访问的特点
- 访问成员变量:编译看左边,执行看左边
- 访问成员方法:编译看左边,执行看右边
访问成员变量和成员方法不一样的原因是:成员方法有重写,而成员变量没有。
访问成员变量与成员方法的具体代码如下所示:
父类Animal:
package com.inherit.test1;public class Animal {int age = 15;String name="豆豆";public void eat(){System.out.println("动物吃东西");}
}
子类Cat:
package com.inherit.test1;public class Cat extends Animal{int age = 10;String name = "点点";@Overridepublic void eat() {System.out.println("猫吃鱼");}
}
测试demo:
package com.inherit.test1;public class Demo {public static void main(String args[]){Animal a = new Cat();System.out.println(a.age);a.eat();}
}
程序运行后结果为:
15
猫吃鱼
从上述代码可以看出,在访问成员变量的时候编译看左边Animal类,执行看左边Animal类,所以最后程序运行的结果为15。而在访问成员方法的时候编译看左边的Animal类,执行看右边Cat类,故调用成员方法eat()后程序执行的结果是:猫吃鱼。
1.3多态的好处和弊端
1:多态的好处:提高了程序的可扩展性。
具体体现:定义方法的时候,使用父类类型作为参数,在使用的时候使用具体的子类参与操作。
可通过以下代码加深对程序可扩展性的理解:
animalOperator类,如果没有使用多态,则每添加一种类型的动物,就要在类中添加一个方法,具体如下所示:
package com.inherit.test1;public class animalOperator {public void useAnimal(Cat c){c.eat();}public void useAnimal(Dog d){d.eat();}
}
父类Animal代码如下所示:
package com.inherit.test1;public class Animal {int age = 15;String name="豆豆";public void eat(){System.out.println("动物吃东西");}
}
子类Cat代码如下所示:
package com.inherit.test1;public class Cat extends Animal{int age = 10;String name = "点点";@Overridepublic void eat() {System.out.println("猫吃鱼");}
}
子类Dog代码如下所示:
package com.inherit.test1;public class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗吃骨头");}
}
测试demo如下所示:
package com.inherit.test1;public class Demo {public static void main(String args[]){Cat a = new Cat();animalOperator ap = new animalOperator();ap.useAnimal(a);}
}
上述代码中,AnimalOperator类的可扩展性较差,当新添加一个动物的时候,需要在类中添加方法useAnimal才可以实现效果,但是如果方法useAnimal中的参数用多态的形式,添加新的动物的时候,只需在方法useAnimal中使用具体的子类就可以实现。
animalOperator类代码如下所示:
package com.inherit.test1;public class animalOperator {public void useAnimal(Animal a){a.eat();}
}
测试代码demo如下所示:
package com.inherit.test1;public class Demo {public static void main(String args[]){Animal c = new Cat();animalOperator ap = new animalOperator();ap.useAnimal(c);Animal d = new Dog();ap.useAnimal(d);}
}
程序运行结果如下所示:
猫吃鱼
狗吃骨头
2:多态的弊端:不能使用子类特有的功能。
Animal a = new Cat()
因为编译的时候看左边,左边的父类Animal中没有子类中的方法,就会报错。比如对象a就不能使用子类Cat中特有的方法。
1.4多态的向上转型和向下转型
1:向上转型
从子到父,父类引用指向子类对象。比如:Animal a = new Cat()
2:向下转型
从父到子,父类引用转为子类对象
Animal a = new Cat();
Cat c = (Cat)a; //向下转型
1.5总结
初学java的多态的时候,只知道其用法,但是对它如何增强程序的扩展性这里并没有体会太深。现在再重新看多态,通过上述介绍的代码,对多态增强程序扩展性有了更深的了解。
Java中多态详解(参考刘意教程)相关推荐
- Java中CAS详解
转载自 Java中CAS详解 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换 ...
- Java中LinkedList详解
Java中LinkedList详解 LinkedList底层是双向链表 单向链表 双向链表 LinkedList新增的方法 主要增加了针对头结点与尾结点进行操作的方法, 即针对第一个元素和最后一个元素 ...
- Java中super详解
目录 Java中super详解 super的作用: 1. 通过super可以访问父类的构造方法 2. 通过super可以访问父类的属性(非私有) 3. 通过super可以访问 ...
- java中匿名内部类详解_java 中匿名内部类的实例详解
搜索热词 java 中匿名内部类的实例详解 原来的面貌: class TT extends Test{ void show() { System.out.println(s+"~~~哈哈&q ...
- java中priorityqueue_详解JAVA中priorityqueue的具体使用
Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示.本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度, ...
- Java入门——多态详解
关于Java语言中的多态语法机制:[只是多态的基础语法,具体应用后面说] Animal.Cat.Brid三个类的关系 Cat继承Animal Brid继承Animal Cat和Brid之间没有任何继承 ...
- java中implement_详解JAVA中implement和extends的区别
详解JAVA中implement和extends的区别 extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,Java中不支持多重继承,但是可以用接口来实 ...
- java中final详解_Java中final用法与详解
Java中final用法与详解 final作为Java中经常用到的关键字,了解final的使用方法是非常有必要的.这里从final关键字在数据域.方法和类中三个方面分析final关键字的主要用法. f ...
- java中getclass_详解java中this.getClass()和super.getClass()的实例
详解java中this.getClass()和super.getClass()的实例 前言: 遇到this.getClass()和super.getClass()的返回值感到疑惑,经过探索豁然开朗. ...
- JAVA中字符集详解
java虚拟机默认的编码是unicode指的是内存中的编码是unicode,而进行io(包括网络和硬盘)传输时另外编码,通过 System.getProperty("file.encodin ...
最新文章
- laravel的日志服务
- 组策略链接顺序优先级
- 用Delphi制作网络游戏外挂
- 学用软件:laTex软件初体验
- Elasticsearch 嵌套类型nested
- c# 调用服务返回结果模板化
- Bat批处理命令执行中文路径解决方法
- 图文教程使用一套键鼠控制两台电脑
- 软件工程(吕云翔第二版)部分简答题答案
- slickedit 运行java_SlickEdit 一些使用技巧(转载)--一个人的博客
- PSV微豆瓣FM v0.1.0
- 微信小程序 下拉刷新
- 电磁场与波 matlab,电磁场数值计算法与MATLAB实现
- BM25算法——(他人写)
- ESP32 Wi-Fi讲解,station连接热点案例
- 使用Monkeyrunner进行Android自动化的总结
- mysql启动时自动启动event事件
- 赛迪智库发布《虚拟现实产业与应用白皮书》
- PPT打包成EXE常用方法
- word中插入smartart图形(插入图形、设置图形格式、在下方插入图形、在后方插入图形)
热门文章
- 【LTspice仿真软件】如何从官网下载软件和入门到精通的教程
- Linux--vmlinuz、vmlinux、initrd
- window7安装虚拟机上网
- k310.4安装客户端提示self-registration error
- SANGFOR SCSA——网络基础(下)
- win10如何禁用\删除讨厌的ff新鲜事(ff新推荐)(flash弹窗广告)
- linux模拟发包工具,linux发包软件-线不是一个压力测试工具的linux以上收缩服务器可...
- 可行性研究与效益分析
- C语言入门(15道经典题目)
- 网页设计html5留言板代码,web网页设计期末大作业_留言板制作.doc