接口


接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法,本文主要讲解接口,内部类的内容将在下篇博文中进行说明

抽象类

包含抽象方法的类必须定义为抽象类,但抽象类不一定有抽象方法,不能产生抽象类的对象

使用abtract关键字声明抽象类和抽象方法

若我们希望阻止某个类产生任何对象,也可以把它声明成一个抽象类


接口

  • 如何实现
使用interface关键字代替class关键字来产生一个完全抽象的类(是接口而不是抽象类)

  • 特征
#访问权限

可以拥有public,或者默认的包访问这两种可视性


#域:

这些域隐式地是public,static和final的

域不能为空,但是可以被非常量表达式初始化
e.g.
public interface RandVals{

    Random RAND = new Random();
    int RANDOM_INT = RAND.nextInt(10);
    long RANDOM_LONG = RAND.nextLong()*10;
    ...
}//这些域不是接口的一部分,它们的值被储存在该接口的静态储存区域内


#方法声明:

访问权限:
方法声明隐式地是public的
当实现一个接口时,在接口被定义的方法必须显式地定义为public的

返回值类型:
返回类型可以是原类型也可以是协变类型

参数类型:
参数类型不可变,参数名可变
可在方法体中用强制类型转换将接收到的参数转换成更合理的类型


#实现一个接口

在类名后使用implements关键字



#用途
  1. 允许实现接口的类向上转型为接口,由于一个类可以实现多个接口,这变相的使一个类可以向上转型为多种基类型(包括接口,这带来了极大的灵活性),实现某种类似多重继承的变种(Java不允许直接实现多重继承详见 谈谈我对复用类的理解)                     
  2. 另一个用途是防止客户端程序员创建该类的对象,并确保这仅仅是建立一个接口

完全解耦

在了解完全解耦之前,先考虑这样一个问题:为什么Java为什么是单根继承结构?

  • 单根继承结构有如下好处:
  1. 单根继承结构中所有对象都拥有一个共用的接口,所以归根结底它们都是相同的类型         
  2. 单根继承结构保证所有对象都具备某些功能                                                                    
  3. 单根继承结构使垃圾回收器的实现变得容易得多,而垃圾回收器正是相对C++的重要改进之一。由于所有对象都保证具有其类型信息,因此不会因无法确定对象的类型而陷入僵尸。这对于系统级操作(如异常处理)显得尤其重要,并且给编程带来了更大的灵活性。

  • 但是单根继承结构也带来了问题:
我们之前也提到了类可以向上转型为接口类型对象。
想象这样一种情况:当一个方法接收的是一个基类的对象参数,那么你就只能操作这个类对象及其子类对象,而你不能将这个方法应用于不在此继承结构中的某个类对象。
(像上面这种能够根据所传参数对象的不同而产生不同行为的方法,被称为策略设计模式)

  • 那么怎么解决这个问题呢?
使用接口类型对象作为方法参数,实现此接口的类的所有实例都可以作为实参传入(我们经常碰到的情况是无法修改我们想要使用的类,这时候我们可以使用适配器模式),从而避免了继承不必要的方法和域

更多关于设计模式知识的参考这篇博文

  • 结论
将接口从具体实现中解耦使得接口可以应用于多种不同的具体实现,因此代码也就更具有复用性


通过继承来扩展接口

简单的说就是接口也可以使用extends来继承其他接口,这时我们可以使用extends关键字来声明要继承的接口,接口之间用","分隔开,这种语法仅适用于接口继承


嵌套接口

接口可以嵌套在类或其他接口中,
嵌套接口除了像非嵌套接口一样,拥有public和包访问这两种可视性之外,也可以被实现为private的


#private嵌套接口

  • 作用
实现一个private的嵌套接口,使得可以强制该接口中的方法定义不要添加任何类型的信息(也即是说,不允许向上转型)

  • 注意事项
当实现某个接口时,并不需要实现嵌套在其内部的任何接口。
而且,private接口不能在定义它的类之外被实现


总结

许多人只要有可能就去创建接口和工厂,这实际上已经变成了一种草率的设计优化,任何抽象性都应该是应真正的需求而变化的,恰当的原则应该是优先选择类而不是接口。从类开始,如果接口的必须形变的非常明确,那么就进行重构。接口是一种重要的工具,但是它们容易被滥用。

参考书籍:《Think in Java》
本文只供学习交流之用,尊重他人劳动成果,转载请注明出处。
https://danserlesgens.blogspot.com/2018/04/blog-post_29.html


Comments

Popular posts from this blog

抓包工具Wireshark下载及安装教程

HTTP协议特性

Java中Synchronized的用法