java8-3 多态的好处和弊端以及多态的理解
多态的好处:
A:提高了代码的维护性(继承保证)
B:提高了代码的扩展性(由多态保证)
猫狗案例代码
class Animal {
public void eat(){
System.out.println("eat");
} public void sleep(){
System.out.println("sleep");
}
} class Dog extends Animal {
public void eat(){
System.out.println("狗吃肉");
} public void sleep(){
System.out.println("狗站着睡觉");
}
} class Cat extends Animal {
public void eat() {
System.out.println("猫吃鱼");
} public void sleep() {
System.out.println("猫趴着睡觉");
}
} class Pig extends Animal {
public void eat() {
System.out.println("猪吃白菜");
} public void sleep() {
System.out.println("猪侧着睡");
}
} //针对动物操作的工具类
class AnimalTool {
private AnimalTool(){} /*
//调用猫的功能
public static void useCat(Cat c) {
c.eat();
c.sleep();
} //调用狗的功能
public static void useDog(Dog d) {
d.eat();
d.sleep();
} //调用猪的功能
public static void usePig(Pig p) {
p.eat();
p.sleep();
}
*/
public static void useAnimal(Animal a) {
a.eat();
a.sleep();
}
//把所有的可能都归为动物类
} class DuoTaiDemo2 {
public static void main(String[] args) {
//我喜欢猫,就养了一只
Cat c = new Cat();
c.eat();
c.sleep(); //我很喜欢猫,所以,又养了一只
Cat c2 = new Cat();
c2.eat();
c2.sleep(); //我特别喜欢猫,又养了一只
Cat c3 = new Cat();
c3.eat();
c3.sleep();
//...
System.out.println("--------------");
//问题来了,我养了很多只猫,每次创建对象是可以接受的
//但是呢?调用方法,你不觉得很相似吗?仅仅是对象名不一样。
//我们准备用方法改进
//调用方式改进版本
//useCat(c);
//useCat(c2);
//useCat(c3); //AnimalTool.useCat(c);
//AnimalTool.useCat(c2);
//AnimalTool.useCat(c3); AnimalTool.useAnimal(c);
AnimalTool.useAnimal(c2);
AnimalTool.useAnimal(c3);
System.out.println("--------------"); //我喜欢狗
Dog d = new Dog();
Dog d2 = new Dog();
Dog d3 = new Dog();
//AnimalTool.useDog(d);
//AnimalTool.useDog(d2);
//AnimalTool.useDog(d3);
AnimalTool.useAnimal(d);
AnimalTool.useAnimal(d2);
AnimalTool.useAnimal(d3);
System.out.println("--------------"); //我喜欢宠物猪
//定义一个猪类,它要继承自动物,提供两个方法,并且还得在工具类中添加该类方法调用
Pig p = new Pig();
Pig p2 = new Pig();
Pig p3 = new Pig();
//AnimalTool.usePig(p);
//AnimalTool.usePig(p2);
//AnimalTool.usePig(p3);
AnimalTool.useAnimal(p);
AnimalTool.useAnimal(p2);
AnimalTool.useAnimal(p3);
System.out.println("--------------"); //我喜欢宠物狼,老虎,豹子...
//定义对应的类,继承自动物,提供对应的方法重写,并在工具类添加方法调用
//前面几个必须写,我是没有意见的
//但是,工具类每次都改,麻烦不
//我就想,你能不能不改了
//太简单:把所有的动物都写上。问题是名字是什么呢?到底哪些需要被加入呢?
//改用另一种解决方案。 } /*
//调用猫的功能
public static void useCat(Cat c) {
c.eat();
c.sleep();
} //调用狗的功能
public static void useDog(Dog d) {
d.eat();
d.sleep();
}
*/
}
2、
多态的弊端:
不能使用子类的特有功能。
我就想使用子类的特有功能?行不行?
行。
怎么用呢?
A:创建子类对象调用方法即可。(可以,但是很多时候不合理。而且,太占内存了)
B:把父类的引用强制转换为子类的引用。(向下转型)
对象间的转型问题:
向上转型:
Fu f = new Zi();
向下转型:
Zi z = (Zi)f; //要求该f必须是能够转换为Zi的.(所属关系)
多态的问题理解:
class 孔子爹 {
public int age = 40;
public void teach() {
System.out.println("讲解JavaSE");
}
}
class 孔子 extends 孔子爹 {
public int age = 20;
public void teach() {
System.out.println("讲解论语");
}
public void playGame() {
System.out.println("英雄联盟");
}
}
//Java培训特别火,很多人来请孔子爹去讲课,这一天孔子爹被请走了
//但是还有人来请,就剩孔子在家,价格还挺高。孔子一想,我是不是可以考虑去呢?
//然后就穿上爹的衣服,带上爹的眼睛,粘上爹的胡子。就开始装爹
//向上转型
孔子爹 k爹 = new 孔子();
//到人家那里去了
System.out.println(k爹.age); //40
k爹.teach(); //讲解论语
//k爹.playGame(); //这是儿子才能做的
//讲完了,下班回家了
//脱下爹的装备,换上自己的装备
//向下转型
孔子 k = (孔子) k爹;
System.out.println(k.age); //20
k.teach(); //讲解论语
k.playGame(); //英雄联盟
2、向下转型中有可能的异常:
ClassCastException:类型转换异常
一般在多态的向下转型中容易出现
最新文章
- Redux原理(一):Store实现分析
- NopCommerce Alipay 支付插件
- java 项目创建中的问题汇总
- Rotating Image Slider - 图片旋转切换特效
- 过滤html字符的方法
- tulterbot遥感操作使用Interactive Markers--12
- BASLER 镜头选型白皮书
- 在SharePoint 2013 中使用文档库Scheduling (计划公布功能)
- hql(Hibernate Query Language)
- C#在winform中读写ini文件
- 第三周java学习总结
- 将.NET Core部署在Docker
- Web前端-Vue.js必备框架(二)
- spring cloud Hystrix监控面板Hystrix Dashboard和Turbine
- spring security学习
- Add custom field in Material Master
- 广州移动宽带DNS
- JQuery实用技巧
- MVC, EF, Code First 相关问题总结
- 1997: [Hnoi2010]Planar
热门文章
- C++ 面向对象的三个特点--继承与封装(二)
- SDK Build Tools revision (19.0.3) is too low for project Min
- [.NET] 使用C#开发SQL Function来提供数据 - 天气预报
- Vue自带的过滤器
- Snort - manual 笔记(三)
- IOS开发--常用工具类收集整理(Objective-C)(持续更新)
- CocoaPods的安装(图文并茂)OS X 10.11 系统
- iOS支付宝集成时遇到的问题整理(1)
- 转 android launch flow
- android中的事件传递和处理机制