面向对象5---多态
来源:互联网 发布:手机流量软件 编辑:程序博客网 时间:2024/06/15 00:13
一.多态的概述及前提条件
- 多态:某一个事物,在不同时刻表现出来的不同状态
- 多态的前提条件:
- 必须有继承关系
- 继承一个类的同时,子类中必须有方法重写
- 父类的引用指向子类对象(向上转型)
格式:Fu f = new Zi();(将f代表的父类引用指向堆内存的子类对象)
二.多态成员访问特点
成员变量:编译看左,运行看左
非静态成员方法:编译看左,运行看右
静态成员方法:编译看左,运行看左
(编译看左,如果左没有这个成员,报错)
看程序写结果:
class A{ public void show() { show2(); } public void show2() { System.out.println("我"); }}class B extends A { public void show2() { System.out.println("爱"); }}class C extends B { public void show() { super.show(); } public void show2() { System.out.println("你"); }}public class Test { public static void main(String[] args) { A a = new B(); a.show(); B b = new C(); b.show(); }}结果:爱你
继承里面:如果子类继承父类,会将父类中的方法继承过来,子类没写,默认有这样的方法
子父类中的分层初始化!(父类先进行初始化,子类进行初始化!)
分析:
a.show(),show非静态成员方法,编译看左,运行看右.B类继承A类,,继承过来show方法,输出show2中的”爱”
b.show(),show非静态成员方法,编译看左,运行看右.C类继承B类,执行show2,输出”你”
三.多态的好处及弊端
多态的好处:
提高代码维护性(又继承保证)
提高代码扩展性(由多态保证)多态的弊端:父类对象不能访问子类特有功能
解决方法:
a.创建子类对象
b.把父类的引用强制转换为子类对象(向下转型)Fu f = new Zi() ;向上转型
Zi z = (Zi)(f) ;向下转型使用向下转型会出现一个异常:(运行时期的异常)ClassCastException
class Animal2{ public void eat(){ } public void sleep(){}}class Cat2 extends Animal2{}class Dog2 extends Animal2{}public class Demo2{ public static void main(String[] args) { //使用向上转型 Animal2 a = new Cat2() ;//猫是动物:内存是猫 //还原成猫 //向下转型 Cat2 c1 = (Cat2) a ;//内存还是猫 //向上转型 a = new Dog2() ;//内存是狗 //还原成狗 Dog2 d = (Dog2) a ;//内存还是狗 //编译不报错!,运行发生一个异常!:ClassCastException:(RuntimeException:运行时期的异常!) Cat2 c2 = (Cat2) a ; }}
四.多态的练习
1.猫狗案例多态版:
/* * 猫狗案例练习多态版 * 动物: * 吃(); * 猫 extends 动物{ * 重写eat(); * 猫玩游戏(); * } * 狗 extends 动物{ * 重写eat(); * 狗看门(); * } * * */class Animal{ public void eat(){ System.out.println("吃饭"); }}//定义猫类class Cat extends Animal{ @Override public void eat(){ System.out.println("猫吃鱼.."); } //特有功能 public void playGame(){ System.out.println("猫玩游戏.."); }}//定义狗类class Dog extends Animal{ @Override public void eat(){ System.out.println("狗吃猫.."); } //特有功能 public void lookDoor(){ System.out.println("狗看门..."); }}//测试类public class Demo1{ public static void main(String[] args) { //向上转型:测试猫 Animal a = new Cat() ; a.eat(); //报错,不能调用子类特有的方法// a.playGame(); //还原成猫:向下转型 Cat c = (Cat) a; c.eat(); c.playGame(); System.out.println("--------"); Animal e = new Cat() ; e.eat(); //报错,不能调用子类特有的方法// e.playGame(); //还原成狗:向下转型 Cat f = (Cat) e; f.eat(); f.playGame(); System.out.println("--------"); }}
阅读全文
0 0
- 面向对象5---多态
- 黑马程序员--5--面向对象--多态
- 面向对象(1)---多态
- 面向对象 -- 多态
- 面向对象--多态
- 面向对象_03_多态
- javaSE-面向对象-多态
- 面向对象-多态
- 面向对象-多态
- 面向对象--多态
- 面向对象-多态
- 面向对象--多态
- 17 面向对象 多态
- day04--面向对象--多态
- 面向对象_多态
- java面向对象-多态
- 面向对象特性-多态
- JavaScript 面向对象:多态
- 【POJ 3301】 三分 Texas Trip
- 6超链接下
- 高并发请求服务器时,经常出现如下异常:java.lang.OutOfMemoryError: unable to create new native thread的解决方法
- 【原创】【区间上的贪心 第二篇】POJ 1083 Moving Tables
- sizeof和strlen
- 面向对象5---多态
- ccf门禁系统201412-1
- G
- 7嵌入图片
- 关于SSM框架体会和小结
- “玲珑杯”ACM比赛 Round #18 A -- 计算几何你瞎暴力(暴力)
- 半杯水
- 欢迎使用CSDN-markdown编辑器
- 简单的“三子棋”