------- android培训、java培训、期待与您交流! ----------
面向对象之多态
定义:某一类事物的多种存在形态。
如狗是狗,也是动物;水的三种形态;
体现:父类或接口的引用指向或者接收自己的子类对象;
好处:多态的存在提高了程序的扩展行和后期维护性,同一个父类的引用可以指挥一批对象做事情。
前提:A.存在着继承或者实现关系
B:有方法的重写
C:父类(接口)引用指向子类(实现)对象
好处:多态的存在提高了程序的扩展性和后期可维护性
弊端:虽然可以预先使用,但是只能访问父类中已有的功能,运行的是后期子类的功能,不能预先使用子类中定义的特有功能。
这个时候要么创建子类对象,调用其特有方法,也可以将父类的引用强转成子类类型,然后赋给子类的引用,然后调用方法。
如:Fu f = new Zi( );
Zi zi = (Zi)f;
Zi.method();
多态中对象调用成员的特点:参考:刘意_DuoTaiDemo3.java,内存图!自己画图理解!
Fu f = new Zi();
A:成员变量
编译看左边,运行看左边(不论是否静态修饰,因为变量不存在重写)
B:成员方法
编译时看左边的的引用变量所属的类是否有所调用的成员方法;
运行时看对象所属的类是否有所调用的成员方法;
简单而言即:编译看左边,运行看右边(因为方法存在重写)
C:静态方法
编译看左边,运行看左边(因为静态方法和变量与对象无关,这样就与多态无关了)
练习:
class Animal{
public void eat(){
}
}
class Dog extends Animal{
public void eat(){
System.out.println("dog eat");
}
public void play(){
System.out.println("dog play");
}
}
class Cat extends Animal{
public void eat(){
System.out.println("cat eat");
}
}
class DuoTaiTest{
public static void main(String[] args)
{
Animal a = new Cat(); //多态,向上转型
a.eat();//"cat eat"
a = new Dog();
a.eat();//dog eat
//a.play();
Dog d = (Dog)a; //向下转型
d.eat();//dog eat
d.play();//dog play
//ClassCastException
Cat c = (Cat)a;//编译时不报错,因为语法没问题
c.eat();//ClassCastException
}
}