多态的理解

多态:一个引用在不同情况下的多种状态,父类的引用指向子类的对象。

下面通过一个实例分析:

package com.itheima;

class Animal {
	void eat() {
		System.out.println("动物会吃东西");
	}
}

class Cat extends Animal {
	void eat() {
		System.out.println("吃鱼");
	}
	void catchMouse() {
		System.out.println("抓老鼠");
	}
}
class Dog extends Animal {
	void eat() {
		System.out.println("啃骨头");
	}
	 void guardHouse() {
		 System.out.println("看家");
	 }
}

public class DuotaiDemo {
	public static void main(String[] args) {
		Animal a1 = new Cat();
		a1.eat();
		Animal a2 = new Dog();
		a2.eat();
	}
}


1.多态的体现

Animal a1 = newCat();

         父类的引用指向了自己的子类对象,即父类的引用也可以接收自己的子类对象。

2.多态的前提

         必须是类与类之间有关系,要么继承,要么实现;

         存在覆盖。

3.多态的好处

         多态的出现大大地提高了程序的扩展性。

4.多态的弊端

         提高了扩展性,但是只能使用父类的引用访问父类中的成员。

5.多态的出现代码中的特点(多态使用的注意事项)

在多态中成员函数的特点:

在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有编译通过,如果没有编译失败。

在执行时期:参阅对象所属的类中是否有相应的方法。

总结:

(1) java中多态强调的是在对象上的体现,其实不在对象上也有体现;比如说函数,重载(同一个函数名称在一个类中有多个)、覆盖(同一函数在子类和父类都具有)也是多态性的体现。

(2) 多态自始至终都是子类对象在做着变化,能转换的是父类的引用指向了自己子类对象时,该引用可以被提升,如:Animal a1 = newCat();,Cat()对象的引用向上转型为Animal类型;也可以被强制转换,如:Cat c = (Cat)a1;即将Cat的对象由Animal类型向下转型为Cat类型。

(3) 一个引用能够调用哪些成员(变量和函数),取决于这个引用的类型,如:Animal a1 = new Cat();可以调用eat()方法,不能调用catchMouse()方法,因为在Animal类中没有定义catchMouse()方法。一个引用调用的是哪一个方法,取决于这个引用所指向的对象,如:Animal a1 = new Cat(); a1.eat(); 执行的是"吃鱼"而不是"动物会吃东西"。

成员函数的特点:编译看左边,运行看右边;

成员变量的特点:无论编译和运行,都参考左边(变量只参考引用所属的类);

静态函数的特点:无论编译和运行,都参考左边(静态只参考引用所属)。


你可能感兴趣的:(多态)