黑马程序员_面向对象之多态

来源:互联网 发布:java创建一个学生类 编辑:程序博客网 时间:2024/04/30 20:52


------- 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

}

}

------- android培训、java培训、期待与您交流! ----------
原创粉丝点击