面向对象-多态
来源:互联网 发布:网络词汇2017 编辑:程序博客网 时间:2024/05/22 09:03
2:多态(掌握)
(1)同一个对象在不同时刻体现出来的不同状态。
(2)多态的前提:
A:有继承或者实现关系。
B:有方法重写。
C:有父类或者父接口引用指向子类对象。
父 f = new 子();
多态的分类:
a:具体类多态
class Fu {
class Zi extends Fu { }
Fu f = new Zi( );
b:抽象类多态
abstract class Fu { }
class Zi extends Fu { }
Fu f = new Zi( );
c:接口多态
interface Fu {}
class Zi implements Fu {}
Fu f = new Zi();
(3)多态中的成员访问特点
A:成员变量
编译看左边,运行看左边
B:构造方法
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
C:成员方法
编译看左边,运行看右边(由于成员方法存在方法重写,所以它运行看右边。)
D:静态方法
编译看左边,运行看左边
多态成员访问举例:class Fu {public int num = 100;public void show() {System.out.println("show Fu");}public static void function() {System.out.println("function Fu");}}class Zi extends Fu {public int num = 1000;public int num2 = 200;public void show() {System.out.println("show Zi");}public void method() {System.out.println("method zi");}public static void function() {System.out.println("function Zi");}}class DuoTaiDemo {public static void main(String[] args) {Fu f = new Zi();//要有父类引用指向子类对象。System.out.println(f.num);//100//System.out.println(f.num2);找不到符号f.show();//show Zi//f.method();找不到符号f.function();//function为静态的方法,结果:function Fu}}结果:100show Zifunction Fu
(4)多态的好处:
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 DuoTaiDemo {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();}*/}
(5)多态的弊端:
父不能使用子的特有功能。
现象:
子可以当作父使用,父不能当作子使用。
(6)多态中的转型
当想使用子类的特有方法时:
A:创建子类对象调用方法即可。(可以,但是很多时候不合理。而且,太占内存了)
B:把父类的引用强制转换为子类的引用。(向下转型)
对象间的转型问题:
向上转型(从子到父):
Fu f = new Zi();
向下转型(从父到子):
Zi z = (Zi)f; //要求该f必须是能够转换为Zi的。
(7)孔子装爹的案例帮助大家理解多态
(8)多态的练习
A:猫狗案例
B:老师和学生案例
class Animal {public void eat(){System.out.println("吃饭");}}class Dog extends Animal {public void eat() {System.out.println("狗吃肉");}public void lookDoor() {System.out.println("狗看门");}}class Cat extends Animal {public void eat() {System.out.println("猫吃鱼");}public void playGame() {System.out.println("猫捉迷藏");}}class DuoTaiTest {public static void main(String[] args) {//定义为狗Animal a = new Dog();a.eat();System.out.println("--------------");//还原成狗Dog d = (Dog)a;d.eat();d.lookDoor();System.out.println("--------------");//变成猫a = new Cat();a.eat();System.out.println("--------------");//还原成猫Cat c = (Cat)a;c.eat();c.playGame();System.out.println("--------------");//演示错误的内容//Dog dd = new Animal();//Dog ddd = new Cat();//ClassCastException//Dog dd = (Dog)a;}}
多态的成员访问特点:
方法:编译看左边,运行看右边。
继承的时候:
子类中有和父类中一样的方法,叫重写。
子类中没有父亲中出现过的方法,方法就被继承过来了。
class A {public void show() {show2();}public void show2() {System.out.println("我");}}class B extends A {/*public void show() {show2();}*/public void show2() {System.out.println("爱");}}class C extends B {public void show() {super.show();}public void show2() {System.out.println("你");}}public class DuoTaiTest4 {public static void main(String[] args) {A a = new B();a.show();//爱B b = new C();b.show();//你}}
- 面向对象(1)---多态
- 面向对象 -- 多态
- 面向对象--多态
- 面向对象_03_多态
- javaSE-面向对象-多态
- 面向对象-多态
- 面向对象-多态
- 面向对象--多态
- 面向对象-多态
- 面向对象--多态
- 17 面向对象 多态
- day04--面向对象--多态
- 面向对象_多态
- java面向对象-多态
- 面向对象特性-多态
- JavaScript 面向对象:多态
- java 面向对象 多态
- Java面向对象 ----多态
- mongodb之linux通用二进制包安装
- 常用的排序小算法
- JAVA self study note3
- iOS创建单例的两种方法
- 用EasyUI做的网站后台
- 面向对象-多态
- listview如何去掉分割线
- 校门外的树2
- 面向对象-接口
- UML- 统一建模语言(Unified Modeling Language)创建项目的序列图及类图
- 面向对象-抽象类
- SecureCRT连接Linux
- 预编译器:#运算符和##运算符
- cocos2d-Lua视频教程