面向对象---多态

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;

    }
}

posted @ 2022-09-15 22:07  进步+吃饭  阅读(23)  评论(0)    收藏  举报