面向对象的梳理(6)接口的应用

接口在Java中是一种抽象类型,用于定义类必须实现的方法。它们用于实现多继承、代码解耦、规范类行为。接口不包含实现,而抽象类可以有。一个类可以实现多个接口,但只能继承一个抽象类。接口的应用示例包括打印机的墨水和纸张类型。面向对象设计原则如单一职责、开放封闭原则等在接口和抽象类的设计中至关重要。
摘要由CSDN通过智能技术生成

目录

1.什么是接口?

2.为什么使用接口?

3.怎样使用接口?(接口的实例应用)

4.接口的功能与要求

5.抽象类与接口的异同

6.面向对象设计原则


1.什么是接口?

Java中接口是一种抽象类型,它表示一组方法和常量的集合,但并不提供实现。接口定义了一套规范,通过实现该接口,类可以按照这个规范提供自己的具体实现。接口通常用来描述具有相似行为或功能的类的集合,从而实现代码的复用和扩展性。在Java中,接口通过关键字“interface”来定义,并且只包含方法声明、常量和静态方法,不能包含具体的方法实现。任何实现了接口的类都必须实现接口中的所有方法。接口可以继承其他接口,并且一个类可以实现多个接口。

以上文字太多可能会引起不适,所以我们暂时只要记住以下几点:

a.接口不可以创建对象

b.接口中的方法都是默认抽象的

c.接口的实现类要实现接口中的所有方法

public class TalkPackage  implements CallService {
    @Override
    public void callSer() {

    }
}

2.为什么使用接口?

在Java中,使用接口可以实现以下几个目的:

a. 实现多继承:Java不支持多继承,但是一个类可以实现多个接口,从而达到多继承的效果。

public class TalkPackage  implements CallService,SuperService {
    @Override
    public void callSer() {

    }
    public void superSer(){
    }
}

b. 实现代码解耦:接口可以将代码解耦,使得不同的代码模块可以独立开发和测试,最后通过接口实现相互调用。

c. 实现规范和约束:接口可以规范和约束类的行为,使得程序变得更加可靠和可维护。

d. 提高程序的可扩展性:通过接口的使用,可以方便地扩展程序,而不需要修改现有的代码。

3.怎样使用接口?(接口的实例应用)

要求:现在我们拥有一台打印机,在打印机里有彩色的墨水和黑色的墨水,以及A4和B5的纸张,现在要求用接口来实现打印出我们所用的纸张和墨水的类型。

首先第一步我们应该想到要创建接口。可是创建什么为接口呢?打印机?A4B5?好像都行不通,这个时候如果我们花点心思就应该能想到创建一个墨水接口Inbox以及一个纸张接口Paper。

如下图所示:

其次我们就自然而然的想到在Paper接口中写获取纸张的方法,在Inbox接口中写获取墨水颜色的方法,如下所示:

Inbox接口:

public interface Inbox {
    public String getColor();
}

Paper接口:

public interface Paper {
    public String getSize();
}

既然接口已经创建好了这个时候我们就可以去写他们的实现类了,我们可以很容易的知道Inbox包含彩色和黑色,所以要创建Cai类和Hei类作为Inbox的实现类;同理我们现在应该知道Paper的实现类是什么了吧,没错就是你想的那样,现在我们来创建A4类和B5类。

Cai类:

public class Cai implements Inbox{
    @Override
    public String getColor() {
        return "彩色墨";
    }
}

Hei类:

public class Hei implements Inbox{
    @Override
    public String getColor() {
        return "黑色墨";
    }
}

A4类:

public class A4 implements Paper{
    @Override
    public String getSize() {
        return "A4纸张。";
    }
}

B5类: 

public class B5 implements Paper{
    @Override
    public String getSize() {
        return "B5纸张。";
    }
}

 现在我们可以来写打印机类了,首先想到的是打印机类中需要调用接口类,同时要声明打印机类的构造方法,以及其属性的getter  and setter方法,最后要写一个方法输出我们所用的纸张和墨水。如下所示:

Print类:

public class Print {
    Inbox inbox;
    Paper paper;

    public Print() {
    }

    public Print(Inbox inbox, Paper paper) {
        this.inbox = inbox;
        this.paper = paper;
    }

    public Inbox getInbox() {
        return inbox;
    }

    public void setInbox(Inbox inbox) {
        this.inbox = inbox;
    }

    public Paper getPaper() {
        return paper;
    }

    public void setPaper(Paper paper) {
        this.paper = paper;
    }

    @Override
    public String toString() {
        return "Print{" +
                "inbox=" + inbox +
                ", paper=" + paper +
                '}';
    }

    public void method(){
        System.out.println("使用的是"+inbox.getColor()+paper.getSize());
    }

}

在测试类中我们所用的调用方式和多态差不多,下面这串代码的意思其实是比较简单的,将彩色墨的方法赋值给inbox,将A4纸的方法赋值给paper,其次再用set方法赋值,如此一来就可以打印出我们所使用的墨水纸张类型了。如下所示: 

TestPrint类:

public class TestPrint {
    public static void main(String[] args) {
        Print print=new Print();
        InBox inBox=new Cai();
        Paper paper=new A4();
        print.setPaper(paper);
        print.setInBox(inBox);
        print.show();
    }
}

 以下是输出结果:

4.接口的功能与要求

接口表示的是一种能力:

a.表示它能做什么事情,具体的实现由它的实现类表示,接口中有的都是没有方法体的方法。

b.重点在于实现类有何能力,而不在于实现细节。

c.需要满足has a的关系。

5.抽象类与接口的异同

抽象类和接口都是Java中的面向对象编程概念。

相同点:

a. 都无法被实例化,只能被继承或实现。

b. 都可以包含方法、属性、常量等。

c. 都可以被子类继承或实现。

不同点:

a. 抽象类可以定义构造方法,而接口里不能定义构造方法。由于抽象类可以有构造方法,所以它也可以有实例变量。而接口里的变量都是 public static final 类型的常量,可以没有实例变量。

b. 在Java中,一个类最多只能继承一个抽象类,但一个类可以同时实现多个接口。

c. 抽象类可以包含已经实现的方法,但是接口只能包含声明但未实现的方法,必须由实现接口的类来实现接口中的方法。

d. 接口中的所有方法都是 public 的,而抽象类中的方法可以是 public、private、protected 等权限。

e. 抽象类适用于在具有相似属性和方法的类之间建立一个基类,而接口则适用于定义不同类之间的公共行为。

6.面向对象设计原则

a.单一职责原则(Single Responsibility Principle, SRP):一个类应该只有一个引起它变化的原因,即一个类只负责一项职责。

b.开放封闭原则(Open-Closed Principle, OCP):一个软件实体应该对扩展开放,对修改关闭。当需求变化时,我们应该尽量通过扩展已有代码的方式来满足这些变化,而不是修改已有代码。

c.里氏替换原则(Liskov Substitution Principle, LSP):所有能用基类对象的地方,都应该能够使用其子类对象。

d.依赖倒置原则(Dependency Inversion Principle, DIP):高层模块不应该依赖低层模块,两者应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。也就是说,我们要针对接口编程,而不是针对实现编程。

e.接口隔离原则(Interface Segregation Principle, ISP):客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。

f.迪米特法则(Law of Demeter, LoD):一个对象应该对其他对象保持最少的了解,也就是说一个类不应该知道太多关于其他类的信息。尽管这个原则看起来很简单,但是实践中很难实现,因为必须得知道其他类的信息才能完成任务。

g.组合/聚合复用原则(Composite/Aggregate Reuse Principle, CARP):尽量使用组合/聚合,尽量不要使用继承。通过组合或聚合关系设计出的系统具有较好的可重用性、灵活性和扩展性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值