面向对象编程的三大特征:封装;继承;多态
前言: 最近在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 继承关键字;
好了,谢谢大家,先写到这里了,后续打算写写 匿名内部类的相关用法。