您的位置:首页 > 编程语言 > Java开发

JAVA编程思想_笔记(九)

2015-11-13 15:05 232 查看
第9章 接口

接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。

9.1 抽象类和抽象方法

接口也被称为抽象基类,简称抽象类。

抽象方法声明语法:

abstract void f();

包含抽象方法的类叫做抽象类。如果一个类包含一个或多个抽象方法,该类必须限定为抽象的。

一个抽象类(接口)可以继承另一个抽象类(接口)

如果从一个抽象类继承,并想创建该类的对象,那么就必须为基类中的所有抽象方法提供方法定义。如果不这样做,那么导出类也会是抽象类,且必须使用abstract关键字限定该类。

9.2 接口

interface关键字定义接口。

interface定义的是一个完全抽象的类,没有提供任何实现,此类的实现需要继承者创建。interface允许创建者确定方法名、参数列表和返回类型。

接口只提供形式,不提供任何具体实现。

接口被用来创建类与类之间的协议。

接口也可以包含域,但这些域是隐式地static和final的。

interface运行创建一个能够被向上转型为多种基类的类型,来实现某种类似多重继变种的特性。

要让一个类遵循某个特定接口(或者是一组接口),需要使用implements关键字:

声明类的实现。类似于继承。

implements和继承的区别:

implements 实现的是接口,可以是多个接口的实现

继承:继承的是方法,属于单根继承

接口可以继承其他接口,但不能实现其他接口。

要实现一个接口,在接口中被定义的方法必须是被定义为public,否则他接口中的方法得到的是默认的包访问权限,在继承中此方法的访问权限会降低。

接口中的方法默认的访问权限为public .

9.3 完全解耦

策略设计模式:创建一个能够根据所传递的参数对象的不同而具有不同行为的方法。

这类方法包含所要执行的算法中固定不变的部分,

而“策略”包含变换的部分。

策略就是传递进去的参数对象,它包含要执行的代码。

适配器设计模式:将一个类的接口转换为客户希望的另一个接口。适配器(Adapter)模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

优点:

1)通过适配器,客户端可以调用同一接口,

2)复用现存的类,解决现存类和复用环境不一致的问题。

3)将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改源代码。

4)一个对象适配器可以把多个不同的适配者类适配到同一个目标。也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。

缺点:

对于对象适配器来说,更换适配器的实现过程比较复杂。

适用于:

1)系统需要使用现有的类,而这些类的接口都不符合系统的接口。

2)想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

3)两个类所做的事情相同或相似,但是具有不同接口的时候。

4)旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外的接口形式访问,但我们不希望冻手更改原有类的时候。

5)使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要是用第三方组件接口的功能。

9.4 Java中的多重继承

 多重继承:组合多个类的接口的行为,但是只有一个类可以有具体实现。

如果从一个非接口的类继承,那么只能从一个类去继承,其余的基元素都必须是接口。

9.5 通过继承来扩展接口

 通过继承产生的接口包含基类的方法体。不想改变接口,在原有接口的基础上添加新的方法。

一个实现方法类可实现多个接口。

可将接口的实现类赋值给接口对象

接口 接口对象 = new 接口实现方法;

这种赋值可将接口对象作为参数来使用

9.5.1 组合接口时的名字冲突

在组合的不同接口中尽量避免相同的方法名,相同的方法名会造成代码的可读性混乱

9.6 适配接口

 同一个接口可以拥有多个不同的具体实现

 在任何现有类之上添加新的接口,让方法接受接口类型。是一种让任何类都可以对该方法进行适配的方式。

Readable接口中的read()方法实现了将字符串读入charBuffer中,但是只有在需要输出的时候才会调用。

Scanner是文本扫描器类,利用Scanner扫描并输出charBuffer中的内容的顺序:以hasNext()方法为例:第一次调用 hasNext(),由于此时charBuffer并无内容,等待输入,hasNext()方法阻塞,调用并执行read()方法,执行完read()方 法,根据read方法的返回值来确定是否hasNext()的返回值是true或者false:若read()返回值不为-1,则认为hasNext() 为true,并且继续调用read()方法;若read()返回值为-1,则认为hasNext()为false,不再调用read()方法。

另外,在输出时是根据下一个空格标记(cb.append(" "))为准,未读到空格标记之前,无论调用多少次read()方法,都不会输出,直到read()f方法返回-1或者读到空格标记,就会输出之前很多次通 过read()方法加到charBuffer的字符串。

9.7 接口中的域

接口中的域为隐式的static 和 final。

9.71 初始化接口中的域

接口中的域不能是“空final”,但是可以被非常量表达式初始化。

9.8 嵌套接口

接口可以嵌套在类或者其他接口中。

在嵌套接口中,接口可被定义为private,强制该接口中的方法定义不要添加任何类型信息(不允许向上转型)。

接口之间也可以嵌套接口,被嵌套的接口必须定义为public .

9.9 接口与工厂

工厂方法设计模式:接口是实现多重继承的途径,而生成遵循某个接口的对象的经典方式。

在工厂对象上调用的是创建方法,而该工厂对象将生成接口的某个实现的对象 。

工厂方法设计模式提高程序的可扩展性和减少代码的修改量。

9.10 总结

 根据所需,选择性使用接口或者创建一个工厂。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: