面向对象编程的三大特征:封装;继承;多态
前言: 最近在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);}@Overridepublic void cry() {super.cry();System.out.println("Cat cry()");}
}
Food 类参照动物类,猫类;狗类;可以写出,主要是 extends 继承关键字;
好了,谢谢大家,先写到这里了,后续打算写写 匿名内部类的相关用法。