情景带入:
公司需要你设计一个模拟鸭子的游戏。
1、所以你创建了一个父类Duck.java类,并写了公共方法,会游泳,还会呱呱叫,因为所有鸭子都会。
public class Duck {
public void swim(){
System.out.println("duck swim.........");//鸭子游泳
}
public void quack(){
System.out.println("duck gua gua gua.........");//鸭子呱呱叫
}
public void display(){
swim();//展示这只鸭子的技能
quack();//展示鸭子呱呱叫
}
}
2、你还创建了2种不同种类的鸭子,子类 RedheadDuck(红头鸭)、RubberDuck(机器鸭),他们都继承了Duck父类
//红头鸭子
public class RedheadDuck extends Duck{
@Override
public void swim() {
System.out.println("RedheadDuck swim..............");
}
@Override
public void quack() {
System.out.println("RedheadDuck quack..............");
}
}
//机器鸭子
public class RubberDuck extends Duck{
@Override
public void swim() {
System.out.println("RubberDuck swim......................");
}
@Override
public void quack() {
System.out.println("RubberDuck quack......................");
}
}
//演示2只鸭子的功能
public class DemoDuck {
public static void main(String[] args) {
RedheadDuck redheadDuck = new RedheadDuck();
redheadDuck.display();
System.out.println();
Duck rubberDuck = new RubberDuck();
rubberDuck.display();
}
}
这是2只鸭子所具有的功能:
接着,公司说需要让鸭子飞。很简单嘛,直接在父类加个fly方法不就好了
//父类加了fly方法
public class Duck {
public void swim(){
System.out.println("duck swim.........");//鸭子游泳
}
public void quack(){
System.out.println("duck gua gua gua.........");//鸭子呱呱叫
}
public void fly(){
System.out.println("duck fly.........");//鸭子飞起来了
}
public void display(){
fly();//让鸭子飞起来
swim();//展示这只鸭子的技能
quack();//展示鸭子呱呱叫
}
}
//红头鸭子类重写fly方法
public class RedheadDuck extends Duck{
@Override
public void swim() {
System.out.println("RedheadDuck swim..............");
}
@Override
public void quack() {
System.out.println("RedheadDuck quack..............");
}
@Override
public void fly() {
System.out.println("RedheadDuck fly..............");
}
}
//我没有重写fly,因为机器鸭是不会飞的
public class RubberDuck extends Duck{
@Override
public void swim() {
System.out.println("RubberDuck swim......................");
}
@Override
public void quack() {
System.out.println("RubberDuck quack......................");
}
}
起因:机器鸭不能飞,所以我没有重写他的fly方法,但我继承了他的父类。然后就发生了奇怪的事情。
导致结果:公司演示鸭子游戏的时候,满天的机器鸭子也在飞。
原因是:我没有在机器鸭的类里重写fly方法。于是我重写了该方法。
引出的问题:但我想到一个问题, 以后我每创建一个鸭子 子类,我就需要根据鸭子是否可以飞,来决定是否重写他的fly方法,好麻烦。。。。
解决方法: 我们遵循设计原则---找出子类中肯能需要变化的地方,把它们独立起来,不要和那些不需要变化的代码混在一起。
创建一个 Flyable 的接口,创建鸭子 子类的时候,如果该鸭子是需要飞的,就实现该接口
//可飞行接口
public interface Flyable {
void fly();
}
//实现Flyable
public class RedheadDuck extends Duck implements Flyable {
@Override
public void swim() {
System.out.println("RedheadDuck swim..............");
}
@Override
public void quack() {
System.out.println("RedheadDuck quack..............");
}
@Override
public void fly() {
System.out.println("RedheadDuck fly..............");
}
@Override
public void display() {
fly();
super.display();
}
}
//不实现Flyable
public class RubberDuck extends Duck{
@Override
public void swim() {
System.out.println("RubberDuck swim......................");
}
@Override
public void quack() {
System.out.println("RubberDuck quack......................");
}
}
//删除fly方法,只放鸭子共有的
public class Duck {
public void swim(){
System.out.println("duck swim.........");//鸭子游泳
}
public void quack(){
System.out.println("duck gua gua gua.........");//鸭子呱呱叫
}
public void display(){
swim();//展示这只鸭子的技能
quack();//展示鸭子呱呱叫
}
}
大家可以,自己创建一个例子试试
这是我的公众号,对大家有帮助,昔日贤文