【面向对象编程的三大特征:封装;继承;多态】

面向对象编程的三大特征:封装;继承;多态

前言: 最近在B站搜到韩顺平老师的java入门课,这里记录下实践;

熟悉&&掌握面向对象三大特征:封装;继承;多态;

多态是基于封装,继承的,所以下面是多态的一个例子:
主人类:拥有给他的宠物(猫,狗,猪 等等)喂食(Feed )的方法,没有用多态的时候,需要针对不同的动物与不同的食物写对应的方法;例如给狗喂食,feed(Dog dog,Done done),
给猫喂食 feed(Cat cat,Fish fish);

解决思路

观察每一个喂食方法,可以发现猫,狗,猪 可以归属于动物类(Animal类);骨头,鱼 可以归属于食物类(Food 类);也就是说抽象多一层后,就不再用针对每种动物写不同的方法,从而减少重复性的代码,更加容易维护,大大增加开发效率。

主人类:

package com.lrtjava.poly_;

public class Master {
    String name ;

    public Master(String name){
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    // 使用多态后,抽象一层动物类,食物类 
    public void feed (Animal animal, Food food){
        System.out.println("主人"+ name + "给" + animal.getName() + "吃" + food.getName());
    }
    // 使用多态前,针对不同的动物,写不同喂食方法
    public void feed (Dog dog, Bone bone){
        System.out.println("主人"+ name + "给" + dog.getName() + "吃" + bone.getName());
    }
    public void feed (Cat cat, Fish fish){
        System.out.println("主人"+ name + "给" + cat.getName() + "吃" + fish.getName());
    }
}


程序入口:

package com.lrtjava.poly_;

public class Poly01 {
    public static void main(String[] args) {
        System.out.println("使用多态前:需要new 每个动物;eg: 猫,狗,new 每种食物eg:鱼,骨头");
        Master m = new Master("Bruce");
        Dog dog = new Dog("大汪汪");
        Bone bone = new Bone("美味的大骨头");
        m.feed(dog,bone);

        Cat cat = new Cat("小喵喵");
        Fish fish = new Fish("小黄鱼");
        m.feed(cat,fish);

        System.out.println("多态后:每个动物继承于动物类Animal,每种食物继承于食物类Food");
        Animal dog2 = new Animal("汪星人2");
        Food bone2 = new Food("骨头2");
        Animal cat2 = new Animal("喵2");
        Food fish2 = new Food("鱼2");
        m.feed(dog2,bone2);
        m.feed(cat2,fish2);


        Animal dog3 = new Dog("汪星人3"); // 向上转型:子类转为父类;
        dog3.cry();

        Animal animal = new Cat("Cat4"); // 要求父类的引用必须指向的是当前目标类型的对象 也就是下面cat4 是 Cat 类型
        Cat cat4 = (Cat) animal; // 需求:父类想调用子类的方法 ; 解决:向下转型-父类转为子类;
        cat4.eat("fish");

    }
}

Animal 类

package com.lrtjava.poly_;
public class Animal {
    String name;
    public  Animal(String name){
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void cry(){
       System.out.println("Animal cry()");
    }
}

Dog 类

package com.lrtjava.poly_;
public class Dog extends Animal {
    String name;
    public Dog (String name){
        super(name);
    }
    public static void eat(String food){
        System.out.println("Dog eat" + food);
    }
}

Cat 类

package com.lrtjava.poly_;

public class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }
    public static void eat(String food){
        System.out.println("Cat eat " + food);
    }
    @Override
    public void cry() {
        super.cry();
        System.out.println("Cat cry()");
    }
}

Food 类参照动物类,猫类;狗类;可以写出,主要是 extends 继承关键字;

好了,谢谢大家,先写到这里了,后续打算写写 匿名内部类的相关用法。

你可能感兴趣的:(java,java,intellij-idea,数据结构)