package com.gao.test.Test6;
public class Girl {
//跟猫玩
// public void play(Cat cat){
// cat.shout();
// }
// //跟狗玩
// public void play(Dog dog){//方法的重载:方法相同参数不同
// dog.clever();
// }
//写了父类之后的优化代码
public void play(Animal an){
an.shout();
}
}
package com.gao.test.Test6;
//public class Cat {
public class Cat extends Animal {//继承父类
//方法
public void shout(){//重写:在子类中重写父类的方法
System.out.println("我是小猫,我会喵喵喵");
}
public void beautiful(){
System.out.println("我是小猫,我很漂亮");
}
}
package com.gao.test.Test6;
//public class Dog {
public class Dog extends Animal{//继承
//喊叫
public void shout(){
System.out.println("我是小狗,我会汪汪汪");
}
//听话
public void clever(){
System.out.println("我是小狗,我很听话");
}
}
package com.gao.test.Test6;
public class Animal {//父类
//因为Dog跟Cat中都有shout(),所以可以有一个父类包含shout(),用于优化代码
public void shout(){
System.out.println("我是小动物,我可以叫");
}
}
package com.gao.test.Test6;
public class Test {
public static void main(String[] args) {
//具体的猫:---->猫的对象
// Cat c = new Cat();
//具体的小女孩:---->女孩的对象
Girl g = new Girl();
//小女孩跟猫玩
//g.play(c);
//具体的狗:--->狗的对象
// Dog d = new Dog();
//小女孩跟狗玩
//g.play(d);
//g.play(an);
//写了父类之后的优化代码
//具体的动物--->动物的对象
//Animal an = new Animal();
//想让这个具体的小动物是这个猫
//Cat c = new Cat();
//Animal an = c;
//上面两句可以合为一句:Animal an = new Cat(); --->父类指向子类对象
//g.play(an);
//添加PetStore类之后的代码优化
Animal an = PetStore.getAnimal("狗");//更改动物,改这个动物名就好了
g.play(an);
}
}
//多态跟属性无关,多态指的是方法的多态,而不是属性的多态
//为了防止干扰,所以类中都没有写属性
/*
总结:
多态的好处:
提高代码的扩展性,符合面向对象的设计原则:开闭原则(指的是扩展是开放的,修改是关闭的)
多态的要素:
1.继承:
2.重写
3.父类指向子类对象
*/
package com.gao.test.Test6;
public class PetStore {//简单工厂模式
//方法:提供动物
//static:加类名.方法名调用,不加就得创建对象,用对象调用
//必须告诉要的小动物名 所以要设置参数
public static Animal getAnimal(String petName){//多态的应用场合(二)
//将父类当做方法的返回值,具体返回的是子类
Animal an = null;//必须设置初始值
if("猫".equals(petName)){//petName.equals("猫")--->这样写容易发生空指针异常
an = new Cat();
}
if("狗".equals(petName)){
an = new Dog();
}
return an;
}
}