多态
(Java)
1、定义:
多态(Polymorphism)是具有表现多种形态的能力的特征。更专业化的说话是:同一个实现接口,使用不同的实例而执行不同的操作。
或(同一个引用类型使用不同的实例而执行不同的操作(父类引用,子类对象))
2、子类到父类的转换(向上转换)
1> 规则
>将一个父类的引用指向一个子类对象,称为向上转型(upcasting),自动进行类型转换
>此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法
>此时通过父类引用变量无法调用子类特有的方法
2> 例如
Dog d = new Dog("欧欧","雪纳瑞"); //不涉及类型转换
d.eat();
Pet p = new Dog("欧欧","雪纳瑞"); //子类到父类的转换
p.eat(); //会调用Dog(子类)的eat()方法,而不是Pet(父类)的eat()方法
...
3、使用父类作为方法形参实现多态
1> 实现多态的三个条件:
>继承的存在(继承是多态的基础,没有继承就没有多态)
>子类重写父类的方法(多态下调用子类重写后的方法)
>父类引用变量指向子类对象(子类到父类的类型转换)
2> 实现多态的优点
>明显减少代码量
>可以提高代码的可扩展性和可维护性
3> 例如
class Person //person类
{
String Name; //姓名
int age; //年龄
public void eat() //吃饭
{
System.out.println("person eating with mouth");
}
public void sleep() //睡觉
{
System.out.println("sleeping in night");
}
}
class Chinese extends Person //中国人类
{
public void eat() //覆盖父类的eat()方法
{
System.out.println("Chinese eating rice with mouth by chopsticks");
}
public void shadowBoxing() //练习太极拳,子类特有的方法
{
System.out.println("practice dashadowBoxing every morning");
}
}
class English extends Person //英国人类
{
public void eat() //覆盖父类的eat()方法
{
System.out.println("English eating rice with mouth by chopsticks");
}
}
class TextEat //测试类
{
public static void main(String[] args) //测试不同国家人吃饭
{
ShowEat(new Person());
ShowEat(new Chinese());
ShowEat(new Enlish ());
}
public static void ShowEat(Person p) //显示不同国家认吃饭
{
p.eat();
}
}
4、父类到子类的转换(向下转型)
1> 概述
将一个指向子类对象的父类引用赋给一个子类的引用,称为向下转型,此时必须进行强制类型转换
2> 例如
Pet p = new Dog("欧欧","雪纳瑞");
p.eat();
Dog d = (Dog)p; //必须进行强制类型转换
d.CatchingFlyDisc(); //OK!NO PROBLEM
|