【Java基础】面向抽象编程与面向接口编程

前言

本文将通过一个案例,实现面向抽象编程与面向接口编程,在举例之前先简单说明下抽象与接口这两个概念。
1、面向抽象:抽象类的设计就是只关心操作,不关心具体实现,这样可以使得程序设计者在
将主要精力放在程序设计上,而不必拘泥于细节的实现。如人类分中国人、美国人、韩国人,他们都说早上好,设计者只需要设计一个speak()抽象方法,不用管具体哪国人说什么语言,他们具体说的语言给其他具体实现的程序员去做。抽象编程常常与继承多态结合,面向抽象编程可以更适应需求变化,如我们又加一个日本人,使得代码可维护,在设计上注重于将共性抽取出来,也就是将子类的共性抽取出来,形成一个抽象父类来继承。

2、面向接口:接口中只有抽象方法,不像抽象类中可以有普通方法。接口只关心操作,而不关心具体实现细节,可以把主要精力放在程序设计上,内容细节由实现接口的类去完成。开发中比如我们开发一个登录功能,这时就可以用面向接口编程,不用管登录的具体细节,如实现登录时记录登录人数,只要定义loginEvent接口即可,以后开发接口非常常用。

这里就会出现一个问题,面向抽象和面向接口很相似,都是不关注实现,让其他类去实现对应的方法,为什么还要弄出两个,只用抽象类不行吗?
答:抽象类表示存在一个严重问题,每个类只能继承一个类,java是不支持多继承的,如果一个类想继承多个类,比如Employee extends Person,还想extends 其他类,是不允许的,C++允许一个类继承多个类,也就是多继承,但Java不支持原因是多继承会让语言变得非常复杂或者效率降低,所以开发中常用接口,接口可以提供多重继承的大多数好处,同时还能避免多重继承的复杂性和低效性。

常考面试题:接口和抽象类的区别
1、抽象类中除了有抽象方法以外,还可以有普通方法,而接口中必须全是抽象方法(public abstract 可省略)
2、抽象类只能继承一个,接口可以实现多个
3、抽象类中的成员变量可以是各种类型,而接口中的成员变量只能是public static final(可省)类型

案例

1、面向抽象编程

分析
编写抽象类Animal就是只关注有两个行为,不关注具体实现,具体实现又其子类来实现,然后实现后只需要创建Simulator,往playSound方法中传入这个具体实现(猫或狗—多态)。

Animal.java

public abstract class Animal {
    public abstract void cry();
    public abstract String getAnimalName();
}

Simulator.java

public class Simulator {
    public void playSound(Animal animal){
        System.out.print(animal.getAnimalName()+":");
        animal.cry();
    }
}

Cat.java

public class Cat extends Animal {
    @Override
    public void cry() {
        System.out.println("喵喵喵");
    }

    @Override
    public String getAnimalName() {
        return "猫";
    }
}

Dog.java

public class Dog extends Animal{
    @Override
    public void cry() {
        System.out.println("汪汪汪");
    }

    @Override
    public String getAnimalName() {
        return "狗";
    }
}

Application.java

public class Application {
    public static void main(String[] args) {
        Simulator simulator = new Simulator();
        simulator.playSound(new Cat());
        simulator.playSound(new Dog());
    }
}

输出
在这里插入图片描述

2、面向接口编程

分析
同样的案例,只是这里是接口
设计一个动物声音“模拟器”,希望可以模仿许多动物的叫声(cry),要求如下:

  • 编写接口Animal
    Animal接口有两个抽象方法cry()和getAnimalName(),既要求给出各种动物叫声与名称

  • 编程模拟器Simulator
    该类有一个playSound(Animal animal)方法,参数类型是Animal

  • 编写Animal接口的Dog类与Cat类

  • 主类:Application

实现代码:

Animal.java

public interface Animal {
    public void cry();
    public String getAnimalName();
}

Simulator.java

public class Simulator {
    public void playSound(Animal animal){
        System.out.print(animal.getAnimalName()+":");
        animal.cry();
    }
}

Cat.java

public class Cat implements Animal{
    @Override
    public void cry() {
        System.out.println("喵喵喵");
    }

    @Override
    public String getAnimalName() {
        return "猫";
    }
}

Dog.java

public class Dog implements Animal {
    @Override
    public void cry() {
        System.out.println("汪汪汪");
    }

    @Override
    public String getAnimalName() {
        return "狗";
    }
}

Application.java

public class Application{
    public static void main(String[] args) {
        Simulator simulator = new Simulator();
        simulator.playSound(new Cat());
        simulator.playSound(new Dog());
    }
}

输出
在这里插入图片描述

That’s all !
在这里插入图片描述

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小样x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值