(八)Java关于接口interface

Java 高度抽象——接口(详解)

前言

​ 在之前,我们用到最重要的关键字 class 。现在我们要接触的的是 Java 中与 class ”平起平坐的“ 的另一个关键字:interface。

什么是接口?interface?

​ interface 翻译过来是界面、接口、交界面。“接口”这个概念在计算机和程序设计领域里,有其特殊的意义。以程序设计为例,“接口”可以特指“函数三要素”,即,函数名称、参数和函数类型(函数返回值类型)。当我们规定了某个函数的接口,同时也规定了函数的功能,但是,不规定函数功能的具体实现过程,那么,这个函数基本上就被认为是“已经确定了的函数”。

​ 对于这样的确定了接口的函数,我们可以在任何需要使用其功能的场合调用它,而无需关心其内部实现的具体过程。这使得,基于“接口"所编写的应用层代码,在接口底层的具体实现发生改变时,应用层代码无需做任何变动!这十分有利于技术的更新换代(用新的技术实现接口底层代码),也十分有利于代码的维护(应用层的代码没有更改,因此也就省去了测试、回归测试等昂贵、繁琐的代码维护成本)。

接口(interface)

基本语法

接口类似于类,但是与类相比,有以下两个个原则是必须遵守的,也是区别与类的关键规则:

  • 接口中的成员只能是共有、静态、常变量,即,必须(自动)拥有 public 、static 和 final 联合属性。
  • 接口中的方法只能是共有,抽象方法,即,必须(自动)拥有 public 和 abstract 联合属性。

InterfaceOne:

public interface InterfaceOne {
	int data = 20;
	void fun();
}

InterfaceTwo:

public interface InterfaceOne {
	public static final int data = 20;
	public abstract void fun();
}

对照上面两个接口,发现 InterfaceOne 的成员和方法没有任何修饰符,但是,与 InterfaceTwo 本质上是一样的。以后除特殊情况外,我们都采用 InterfaceOne 的书写形式。

接口的实现

​ 接口是通过“实现”完成的,“实现”对应一个关键字:implements

​ 通常我们建立一个类,该类“实现”一个或多个接口,从而达到使用接口的目的。(“实现”一个接口,在继承关系角度来看,可以认为就是“继承”)

如果一个类实现了一个接口,那么,这个类就是这个接口的派生类!

​ 首先建立两个接口:

public interface AboutInterface1 {
    //第3、4行代码是等价的
    public static final int num1 = 10;
    int num2 = 20;
	//第6、7行代码是等价的
    public abstract void fun1();
    void fun2();
}
public interface AboutInterface2 {
    int fun3();
}

再创建一个“实现”上述接口的类:

public class ImplementationClass implements AboutInterface1,AboutInterface2 {

    @Override
    public void fun1() {
        System.out.println("实现AboutInterfce接口的类ImplementationClass的fun1()方法");
    }

    @Override
    public void fun2() {
        System.out.println("实现AboutInterfce接口的类ImplementationClass的fun2()方法");
    }

    @Override
    public int fun3() {
        return 0;
    }
}

因为只是对基本规则和语法的介绍,因此很简陋,甚至没有任何的成员和(构造)方法。

首先注意到程序第1行的写法:

public class ImplementationClass implements AboutInterface1,AboutInterface2

​ ImplementationClass 同时“实现”了两个接口。在 implenments 关键字后,两个接口用“逗号”分隔。这一点不同于类的继承!我们也都了解过,Java 拒绝多重继承。

​ 事实上,实现接口的类,必须实现接口所规定的抽象方法。否则该类就是抽象类!

下面给出Demo类,演示一些该类对象与接口之间的继承关系:

public class Demo {
    public static void main(String[] args) {
        ImplementationClass ic = new ImplementationClass();
        System.out.println(ic instanceof ImplementationClass);
        System.out.println(ic instanceof AboutInterface1);
        System.out.println(ic instanceof AboutInterface2);
    }
}

第4、5、6行是在测试 ImplementationClass 的对象 ic 与类 ImplementationClass ,接口 AboutInterface1 、AboutInterface2 之间的从属关系。运行结果如下:

true
true
true

在下图中,我们能从方法的调用角度体现接口对于其派生类之间的一种“命令式”关系:

实现了接口的类的对象,一定能调用接口所规定的所有方法!(这个命令关系式也是“面向接口”编程的核心 基础之一)

单类继承与多接口实现

​ 前面谈到,Java在类继承时是不允许同时继承多个基类的,但是可以实现多个接口。从前面对实现的讨论和验证
可以这么说,Java不允许一个派生类拥有多个基类,但是,可以拥有多个“基“接口。

我的教主朱某人曾向我陈述过

​ 之所以这样,与Java程序设计语言的设计者,在设计Java时的初衷有关。在 Java 出现之前,面向对象程序设计语言已经存在,且有好几种具体的程序设计语言支持“面向对象”程序设计思想,如C++程序设计语言。其实,Java的众多基本语法、继承、方法重载、构造方法等概念都是“学习”C++的。不过,Java开发者认为,C++虽然功能强大,是非常犀利的编程工具,但是也有非常明显的缺点。
​ 尤其是C++过于复杂,而且保持了C语言所特有的“指针”概念;C++是允许多重继承的;C++除了允许函数重载(在Java中就是方法重载)之外,还允许“运算符”重载等等。这些原理复杂、功能强大的编程手段,对于其使用者——程序员而言,提出了几乎严苛的“能力”上的要求!这种“严苛的能力要求”,使得编程经验和计算机相关理论知识浅薄的 C++ 程序设计者所编写的C++程序而言,漏洞百出,很难保证软件产品的质量及研发进度。这也使得 C++ 程序员从新手成长为合格的开发者所需要的培养周期是很长的。

​ Java开发者在开发 Java 之初,其核心诉求之一就是要研发一种“相对 C++ 更‘简单”,更容易掌握,使用者在编程时事不容易出错”的面向对象程序设计语言。而这种思想在Java 语言各处都有所体现。比加,不允许多重继承,是为了避免因多重继承带来的基类成员冲突问题:拒绝指针,从而从根源上杜绝“参数引用传递"这种严重违反模块独立性的奇异手段,讲而也很好地避免了“实例构造方法”会出现的递归现象;最厉害的是,Java 提出了“垃圾回收机制,这从根源上几乎完全杜绝了因编程者能力不足、或不够细心、或项目过于复杂和庞大,而引起的“内存泄漏”这样的致命错误!
​ 总之,Java不支持多重继承是有着深刻考量和权衡的,不能因为这一点就片面和简单地认为 Java 不如 C++。(考虑到Java提出的反射机制,客观地说,单重继承确实有性能上的部分损失,因此,Java对于“非常简单”的接口,是允许多重继承的。这部分弥补了性能上的缺失,同时也应了那句话:因为简单,所以安全!

我个人感觉 我们教主 对于Java 及 C++ 的理解是非常深刻的。

接口的特点

  • 类型的统一与保护;

  • 规范方法;

​ 接口在使用中有一个“命令式”的规则,凡是实现了该接口的非抽象类,就必须实现这个接口所规定的所有抽象方法。
​ 这个规则包含着“规范行为”的意义,也就是说,如果在某种应用场合下,我们需要其些类实现我们固定要求实现的一些方法,那么,我们可以将这些方法写进一个接口,然后,让那些类实现这个接口。这时,这些类就“被迫”要实现这些方法,且必须全部实现,一个都不能少,一个也不能改(不能修改接口中规定的方法名称、参数个数、参数类型和返回值类型)!

这里的“规范方法”体现在:

1、指定的所有方法都必须实现;

2、规范了方法的名称;

3、规范了方法的参数个数以及参数类型;

4、规范了方法的返回值类型;

  • 方法的公开;

​ 这个特点同样源于“规范方法”,只是这次是从应用角度看这个问题的。如果我们已经知道一个接口,并能查阅到其要求实现的所有抽象方法;另外,我们得知某些类实现了这个接口,那么,我们就可以非常肯定地说,这些类一定存在这些方法,可以无所顾忌地调用这些方法。

​ “规范方法” 和 “方法的公开“本质是一样的,只是看待问题的角度有所不同;规范方法是从“对接口的实现”角度出发的,而方法的公开是从“接口的应用”角度出发的,这本身就是一对因果关系。

  • 分离原则(面向未来)
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

HB0o0

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

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

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

打赏作者

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

抵扣说明:

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

余额充值