概念
多态是面向对象程序设计的一个重要特征,指同一个实体具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。
例如小猫小狗都是动物,他们都需要吃东西等相同特征,但他们爱吃的东西不一样,这就是重写。多态对象只能调用父类中定义子类中重写的功能,但不能调用子类特有功能,实现代码统一
特点
多态前提是继承,且要有方法的重写
父类引用指向子类对象
使用
成员变量使用父类的
成员方法使用子类的
编译由父到子,运行由子到父
/*本类用于测试多态成员的使用情况*/
public class Test0 {
public static void main(String[] args) {
//创建纯子类对象
Dog2 d = new Dog2();
System.out.println(d.sum);//子类自己的属性
d.eat();//小狗爱吃骨头棒,子类自己的方法
//创建多态对象
Animal a = new Dog2();
/*多态中,成员变量使用的是父类的*/
System.out.println(a.sum);//10
/*多态中,方法的声明使用的是父类的,方法体使用的是子类的*/
a.eat();//小狗爱吃骨头棒
/*多态中,调用的静态方法是父类的,因为多态对象把自己看作是父类类型
* 直接使用父类中的静态资源*/
a.play();//玩啥都行
Animal.play();
}
}
//创建父类
class Animal{
//创建父类的成员变量
int sum = 10;
//创建父类的普通方法
public void eat(){
System.out.println("吃啥都行");
}
//定义父类的静态方法play
public static void play(){
System.out.println("玩啥都行");
}
}
//创建子类
class Dog2 extends Animal{
//定义子类的成员变量
int sum = 20;
//重写父类的方法
@Override
public void eat(){
System.out.println("小狗爱吃骨头棒");
}
//创建子类的静态方法play
public static void play(){
System.out.println("小狗喜欢玩皮球~");
}
}
运行结果:
优点
代码更加灵活:无论右边new的时候换成哪个子类对象,等号左边调用方法都不会变化。
提高程序的拓展性:定义方法的时候,使用父类类型作为参数,将来使用时,使用具体的子类类型操作