多态(polymorphic)
定义:动态绑定(多态):在执行期间(不是编译期间)判断所引用对象的实际类型,根据实际类型调用其相应的方法。动态绑定帮助我们程序的可拓展性达到极致。同一类型的对象,在运行的时候表现出不同的形态。
实例理解:例如有一个打飞机的游戏,里面有飞机类、子弹类,原来的思考模式是当飞机出现的时候,调用飞机的自身画自己类,子弹出现的时候调用子弹类,当我们要增加坦克类时,也要进行判断。程序的可拓展性差。这时我们要这样考虑:声明一个游戏的父类,为他定义一个画的方法,无论是飞机、子弹、坦克还是其他的类出现都继承这个父类,然后重写自己画的方法。当要拿出来的时候,不需要判断了,直接调用画的方法。是谁出现就画谁。体现多态思想,系统的可拓展性好。
多态存在的必要条件:继承、重写、父类引用指向子类对象。
注意:
1、多态:父类型的引用可以指向子类的对象。或者接口类型的引用可以指向实现该接口类的实例。
关于接口与实现接口的类之间的强制类型转换方式与父类和子类之间的强制类型转换方式完全一样。
2、例如体现多态的一行代码:
parent p=newchild();看p是什么类型的,就调用什么类型的方法,例如此行代码p属于parent类型,所以就会调用parent里面的方法,例如:p.sing();当使用多态调用方法时,首先检查父类中有没有sing()方法,如果没有则编译错误,如果有再去调用子类的sing()方法。
3、一共有两种类型的强制转换
a)向上类型转换:比如说将Cat转换为Animal,也就是说将子类转换为父类,对于向上类型转换,,不需要显示指定。
Eg:Animal animal=new Cat();
animal.Sing();
b)向下类型转换:比如说将Animal转换为Cat,也就是说将父类转换为子类,对于向下类型转换,需要显示指定。(必须使用强制类型转换)
Eg:Animal a=newCat();
Cat cat=(Cat)a;
cat.sing();
当使用子类特有的方法,父类不存在该方法,则需要使用强制类型转换。
/***
* 多态思想
* 首先知道三要素
* 1,继承 2,重写 3,父类对象指向子类对象
*
* 理解多态的优势。
* 我们要设计一些动物前,先设计动物的基本类
* 如Animal.我们设计好他的名字。和统一的叫声这个方法函数。
* 其次,我们开始单独设计每一种动物的特征
* 先设计Cat猫,他继承了动物的特征后,我们对猫的叫声重写一下。
* 注意重写 必须和父类方法一样。
* 同样,我们又写了狗Dog,bird鸟这两个方法,同时重写了他们的叫声。
*
* 这个时候,我们设计一个小女孩的类Lady。 我们开始设计她的名字,和她将使用的一个
* 对象 动物。
* 我们定义了她的构造方法,里面的参数有名字,和定义的动物对象。
* 同时,我们对他定义了一个方法,并且实现了调用该方法就可实现调用动物的这个叫声。
*
* 我们在主函数里面建立了Cat Dog 和Lady等实现类。
* 当我们调用Lady中调用哪个 动物类的时候,程序会自动找到与其对应的动物的实现方法。
* 这个就叫 多态。
* @author Administrator
*abstract 抽象
*抽象方法必须定义抽象类
*抽象方法只要定义不要实现
*抽象类不能被实力化
*子类抽象类必须被继承,子类抽象方法必须被重写
*/
abstract classAnimal {//定义抽象类
private String name;
Animal(String name) {this.name = name;}
/*
public void enjoy(){
System.out.println("叫声......");
}
*/
public abstract void enjoy();//定义抽象方法,也叫纯虚函数
}
class Cat extends Animal {
private String eyesColor;
Cat(String n,String c)
{super(n); eyesColor = c;}
public void enjoy() {
System.out.println("猫叫声......");
}
//public abstract void enjoy();
}
class Dog extendsAnimal {
private String furColor;
Dog(String n,String c) {super(n); furColor =c;}
public void enjoy() {
System.out.println("狗叫声......");
}
}
class Bird extendsAnimal {
Bird() {
super("bird");
}
public void enjoy() {
System.out.println("鸟叫声......");
}
}
class Lady {
private String name;
private Animal pet;//定义了动物的类 对象
Lady(String name,Animal pet) {//由于pet是动物的对象。而Cat Dog等也是从动物继承而来的
//所以,调用哪种动物,pet就自动传到哪个动物的类上
this.name= name; this.pet = pet;
}
public void myPetEnjoy(){pet.enjoy();}//自动识别方法的过程就叫多态
}
public classTestjava {
public static void main(String args[]){
Cat c = newCat("catname","blue");
Dog d = newDog("dogname","black");
Bird b = new Bird();
Lady l1 = new Lady("l1",c);
Lady l2 = new Lady("l2",d);
Lady l3 = new Lady("l3",b);
l1.myPetEnjoy();
l2.myPetEnjoy();
l3.myPetEnjoy();
//多态的好处在于,我们要增加不同的类或动物类型,那么,无需改动动物的大类。
//只要增加要的类,在主函数中调用就可以了。
}
}