多态跟属性无关,多态指的是方法的多态,而不是属性的多态。
总结:
1、先有父类,再有子类:--> 继承
先有子类,再抽取父类 ----> 泛化
2、什么是多态:
多态就是多种状态:同一个行为,不同的子类表现出来不同的形态。
多态指的就是同一个方法调用,然后由于对象不同会产生不同的行为。
3、多态的好处:
为了提高代码的扩展性,符合面向对象的设计原则:开闭原则。
开闭原则:指的就是扩展是 开放的,修改是关闭的。
注意:多态可以提高扩展性,但是扩展性没有达到最好,以后我们会学习 反射
4、多态的要素:
1) 继承: Cat extends Animal ,Pig extends Animal, Dog extends Animal
2)重写:子类对父类的方法shout()重写
3)父类引用 指向子类对象:
Pig p = new Pig();
Animal an = p;
将上面的代码合为一句话:
Animal an = new Pig();
=左侧:编译期的类型
=右侧:运行期的类型
Animal an = new Pig();
g.play(an);
- public void play(Animal an){//Animal an = an = new Pig();
- an.shout();
- }
上面的代码,也是多态的一种非常常见的应用场合:父类当方法的形参,然后传入的是具体的子类的对象,然后调用同一个方法,根据传入的子类的不同展现出来的效果也不同,构成了多态。
代码示例:
package Package8_face_the_object.test_3_Polymorphism.test_test;
//把所有的类集结到一个程序中
class Girl {
//和猫玩
public void play(Cat cat){
cat.shout();
}
//和狗玩
//上面play()方法的重载
public void play(Dog dog){
dog.shout();
}
//和小动物玩
public void play(Animal an){
an.shout();
}
}
//父类:动物Animal
class Animal {
//shout()方法
public void shout(){
System.out.println("小动物可以喊叫哦!!!");
}
}
class Cat extends Animal{
//喊叫
public void shout(){
System.out.println("小猫喵喵喵!!!");
}
public void guard(){
System.out.println("狗狗保护主人!!!");
}
}
class Dog extends Animal{
//喊叫
public void shout(){
System.out.println("小狗汪汪汪!!!");
}
}
class Pig extends Animal{
public void shout(){
System.out.println("小猪哼哼哼!!!");
}
}
public class Together {
public static void main(String[] args) {
/* //具体的猫 ——> 猫的对象
Cat c = new Cat();
//具体的小女孩 ——> 女孩的对象
Girl g = new Girl();
//具体的狗 ——> 狗的对象
Dog d = new Dog();
//小女孩跟猫玩耍
g.play(c);
//小女孩跟猫狗耍
g.play(d);*/
//向上抽取出一个父类Animal后,
//具体的动物——>动物的对象
//Animal an = new Animal(); //还是没有体现出具体的对象,因为世界上没有哪一个小动物叫小动物
//下面我们让这个具体的小动物是——猫
Girl g = new Girl();
//Cat c = new Cat();
Dog d = new Dog();
//Animal an = c;
Animal an = d; //这样一来,代码的扩展性就会很好(再如下)
//而且,Girl类中也只需要和小动物玩的函数即可,并且不需要更改
Pig p = new Pig();
Animal an2 = p;
//跟小动物玩
g.play(an);
g.play(an2);
}
}