一.多态的概述及前提条件
- 多态:某一个事物,在不同时刻表现出来的不同状态
- 多态的前提条件:
- 必须有继承关系
- 继承一个类的同时,子类中必须有方法重写
- 父类的引用指向子类对象(向上转型)
格式: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("--------");
}
}