目录
概念
举个例子
多态的特点
以动物之间的关系为例解释多态的特点
多态的优点和缺点
多态的向上转型和向下转型
多态就是一个对象表现出多种形态
在面向对象语言中,多态是指同一个实体同时具有多种形式,即同一个对象,在不同情况下代表不一样的对象。也就是你创建了一个对像,他可能有不同的形态。
我去买化妆品,我买了一支眉笔、一支口红、一盘眼影。我拿回来了三样东西,他们具体到某一样当东西是一种形态,我泛泛的把他们称作化妆品也是他们的一种形态。
再比如,我们可以把小猫抽象成一个猫类(Cat),小狗抽象成一个狗类(Dog),猴子抽象成一个猴子类,这些小动物都要吃、喝、玩,那么我们就再抽象出一个动物类(Animals)作为这些动物的父类。动物是不是都要吃、喝、玩?(别抬杠)但是不同的动物吃、喝、玩的具体方式不同。小猫玩可能就是抓老鼠,那猴子,比如孙悟空就是大闹天宫,狗比如哮天犬玩就是飞来飞去。多态对象只能调用子类重写父类的方法,不能调用子类自己独有的方法.比如哮天犬会飞,我在Dog类中定义fly()方法,如果我创建的是多态对象那么这个对象就不能调用fly方法.
有继承关系
子类重写父类方法
父类引用指向子类对象
原则:编译看左边,运行看右边
创建package(包):package polymorphismdemo; 包名:polymorphismdemo
创建类(class):public class Animal{} 类名:Animal
public class Cat extends Animal{} 类名:Cat,继承Animal类
public class Test{} 类名;Test,有main方法,作为程序的入口
public class Test{
public static void main(String [] args){
Animal dog = new Dog(); //父类引用指向子类对象
dog.name = "金毛";
dog.age = 3;
Dog dog1 = new Dog();
dog.eat();//如果Dog类重写了eat()方法,那么调用Dog类中重写的eat()方法,否则调用父类Animal的
System.out.println(dog.name+dog.age+"岁"+dog.eat());
}
}
//父类,Animal类
public class Animal{
public String name;
public int age;
//父类Animal中的eat()方法
public void eat(){
System.out.println("动物吃东西");
}
//父类Animal中的play()方法
public void play(){
System.out.println("动物玩");
}
}
//子类Dog类,继承(extends)了父类Animal类
public class Dog extends Animal{
//重写父类的eat()方法
@Override
public void eat(){
System.out.println("狗吃东西");
}
//重写父类play()方法
@Override
public void play(){
System.out.println("狗玩");
}
public void fly(){
System.out.prontln("哮天犬会飞");
}
}
1. Animal dog = new Dog(); //父类引用指向子类对象
2. dog.eat();//如果Dog类重写了eat()方法,那么调用Dog类中重写的eat()方法,否则调用父类Animal的
1. 创建了一个Dog类的对象,这个对象的类型是Animal类型. 我们都知道,这句话的底层是dog变量指向new Dog()对象,指向的是这个对象的地址,也可以说把Dog对象的地址赋给了dog,dog是引用类型Animal. 也就是父类引用指向子类对象. 编译期间dog是Animal类型,因此dog调用的是Animal类中的方法,无法调用Dog类中的方法,比如:
dog.fly;//fly是Dog类中的方法,dog调不到,编译期就会提示错误
2. 但在运行期,dog这个对象时Dog类型的,所以调用的是Dog这个子类中重写的父类Animal中的方法,尽管如此,子类Dog中特有的方法fly()无法调到,只能创建:
Dog dog1 = new Dog();
dog1可以调用Dog中的方法.这就是编译看左边,运行看右边.
优点:多态提高了程序的可拓展性和可延伸性.
缺点:多态对象无法调用子类特有的方法
我们很容易可以猜到,这里的向上转型和向下转型指的应该是由子类转父类和由父类转子类.
1. 由子类转父类(向上转型)
这一转型很容易就可以转,就像基本类型转换时,2个字节的short向4个字节的int类型转型,可以放得下,默认转型,无需强制类型转换.
Dog dog2 = new Dog();
Ainmal ainmal = dog2;//默认向跟高类型转换
2. 父类向子类转型(向下转型)
这一转型需要强制类型转换,就像基本类型转换时,4个字节的int类型要向比他小的short类型转换,需要强制类型转换.
Animal dog2 = new Dog();//dog2 Animal类型
Dog dog3 = (Dog)dog2; //需要由大类型强制向小类型转换
如有错误,欢迎大家批评指教~