定义:某一类事物的多种存在形态。
比如说猫这类事物既具有猫的形态,也具有动物的形态,这就是事物的多态性。
简单说:就是一个对象对应不同的类型。
多态在代码中的体现:父类或者接口的引用指向其子类的对象。
动物 x=new 猫();//一个对象,两种形态。
动态的好处:提高了代码的重用性。前期定义的代码可以使用后期的内容。
多态的弊端:前期定义的内容不能使用(调用)后期子类定义的特有内容,比如Animals中没有看门的方法,后期狗的子类中所定义的看门方法不能使用。
多态的前提:1.子类与父类必须有关系,要么继承要么实现。
2.要有覆盖。
abstract class Animals{
abstract void eat();
}
class dog extends Animals{
void eat(){
System.out.println("啃骨头.");
}
void lookhome(){
System.out.println("看家");
}
}
class cat extends Animals{
void eat(){
System.out.println("吃鱼");
}
void catchmouse(){
System.out.println("抓老鼠");
}
}
public class DuoTaiDemo {
public static void main(String[] arge){
Animals a=new cat(); //cat既属于猫,也属于动物
a.eat();
Animals b=new dog(); //自动类型提升,猫对象提升成了动物类型,但是特有功能无法访问,作用就是限制对特有功能的访问。
b.eat();
}
public static void method(Animals c){
c.eat();
}
}
}
当自动类型转换后如果还想有具体动物的特有功能,可以将对象进行向下转换。
Animals a=new cat(); //cat既属于猫,也属于动物
a.eat();
cat c=(cat)a; //向下强制转换
c.catchmouse();
多态时,成员的特点
1.成员变量
编译时,参考引用型变量所属的类中是否有调用的成员变量,如果有,编译通过;如果没有,编译失败。
运行时,参考引用型变量所属的类中是否有调用的成员变量,并运行所属类中的成员变量。
简单说,就是编译和运行都参考等号左边的类。在例子中即为animals(animalsa=new cat())
2.成员函数
编译时,参考引用型变量所属的类中是否有调用的函数,如果有,编译通过;如果没有,编译失败。
运行时,参考对象所属的类中是否有调用的函数。
简单说,编译看左边,运行看右边。
3.静态函数
编译时,参考对象所属的类中是否有调用的函数。
运行时,参考对象所属的类中是否有调用的函数。
简单说,编译都运行都看左边。
其实对于静态方法来说是不需要对象的,直接用类名调用即可。