Java抽象接口技巧(一)

原文链接 http://blog.csdn.net/qq_35101189/article/details/70799155

在程序设计过程中,读者很可能遇到这样一种困境:设计了一个接口,但实现这个接口的子类并不需要实现接口中的全部方法,也就是说,接口中的方法过多,对于某些子类是多余的,我们不得不浪费的写上一个空的实现。

今天小菜提到的“抽象接口”,就是用来解决这个问题的。

为了不误导读者,先说明一下,什么是“抽象接口”。

所谓“抽象接口”,即在提供接口的同时,提供一个抽象类,用抽象类实现该接口(实际上这是缺省适配模式)。

下面小菜举个例子,让读者体会这样做的好处。

代码写的不咋地,为了防止读者看不懂,先上一张类图:

具体代码:

  ITestInterface.java

1 /*
2     假设有一个顶层接口
3 */
4 public interface ITestInterface{
5     void method1();
6     int method2();
7     boolean method3();
8 }

  TestAbstract.java

 1 /*
 2     抽象类abstract实现了ITestInterface顶层接口
 3 */
 4
 5 public abstract class TestAbstract implements ITestInterface{
 6     //找出接口中必要的方法,也就是子类必须实现的方法,定义成抽象方法,交由子类实现
 7     public abstract void method1();
 8     public abstract int method2();
 9
10     //一些独特的方法可以在抽象类中默认实现
11     public boolean method3(){
12         return true;
13     }
14 }

  

  TestClass1.java

 1 /*
 2     普通类TestClass1继承了TestAbstract抽象类
 3 */
 4
 5 public class TestClass1 extends TestAbstract{
 6
 7     //TestClass1必须实现抽象的method1方法,该方法最早是接口中定义的
 8     public void method1(){
 9
10     }
11     //TestClass1必须实现抽象的method2方法,该方法最早是接口中定义的
12     public int method2(){
13         return 1;
14     }
15
16     //接口中的method3方法对于TestClass1无关紧要,因此不做重写。
17 }

  TestClass2.java

 1 /*
 2     普通类TestClass2继承了TestAbstract抽象类
 3 */
 4
 5 public class TestClass2 extends TestAbstract{
 6
 7     //TestClass2必须实现抽象的method1方法,该方法最早是接口中定义的
 8     public void method1(){
 9
10     }
11     //TestClass2必须实现抽象的method2方法,该方法最早是接口中定义的
12     public int method2(){
13         return 2;
14     }
15
16     //method3方法对于TestClass2来说至关重要,因此必须重写。
17     public boolean method3(){
18         return false;
19     }
20
21 }

代码精讲:

    从以上例子可以看出,最高层的接口被一个抽象类实现,在抽象类中,我们把关键的method1、method2方法定义成抽象方法,强制子类去实现,而“独特”的method3方法在抽象类中做一个默认实现。

    等到TestClass1、TestClass2继承TestAbstract抽象类时,优势就体现出来了,TestClass1、TestClass2必须实现method1、method2,但如果用不到method3,可以直接无视。

    通过接口和抽象类的结合,避免了在实现接口的子类中出现大量的“无意义”实现,这个“无意义”实现,被缓冲到了抽象类中,完美展现了代码复用(可以把抽象类理解成接口和实现类之间的缓冲)。

    需要指出的是,我们既可以选择继承抽象类,也可以选择实现接口,并不是说一定要继承抽象类,看情况而定,这里是两种选择,两个机会。

写到这,或许读者觉得文章已经结束了,其实没有。。。

这样做的好处不仅仅是这一点,细细品味,假如我们向接口中增加了一个方法。。。

具体代码:

  温馨提示:不要被代码吓到,其实这些代码和上边的差不多,只不过加了个方法而已。

  ITestInterface.java

 1 /*
 2     假设有一个顶层接口
 3 */
 4 public interface ITestInterface{
 5     void method1();
 6     int method2();
 7     boolean method3();
 8     //接口中新增加了方法
 9     String method4();
10 }

  TestAbstract.java

 1 /*
 2     抽象类abstract实现了ITestInterface顶层接口
 3 */
 4
 5 public abstract class TestAbstract implements ITestInterface{
 6     //找出接口中必要的方法,也就是子类必须实现的方法,定义成抽象方法,交由子类实现
 7     public abstract void method1();
 8     public abstract int method2();
 9
10     //一些独特的方法可以在抽象类中默认实现
11     public boolean method3(){
12         return true;
13     }
14
15     //抽象类中提供一个默认实现,这样就可以避免"惊动"所有子类
16     public String method4(){
17         return "";
18     }
19 }

  TestClass1.java

 1 /*
 2     普通类TestClass1继承了TestAbstract抽象类
 3 */
 4
 5 public class TestClass1 extends TestAbstract{
 6
 7     //TestClass1必须实现抽象的method1方法,该方法最早是接口中定义的
 8     public void method1(){
 9
10     }
11     //TestClass1必须实现抽象的method2方法,该方法最早是接口中定义的
12     public int method2(){
13         return 1;
14     }
15
16     //接口中的method3方法对于TestClass1无关紧要,因此不做重写。
17
18     //新增的方法对于TestClass1来说至关重要,因此必须重写
19     public String method4(){
20         return "Class1";
21     }
22
23 }

  TestClass2.java

 1 /*
 2     普通类TestClass2继承了TestAbstract抽象类
 3 */
 4
 5 public class TestClass2 extends TestAbstract{
 6
 7     //TestClass2必须实现抽象的method1方法,该方法最早是接口中定义的
 8     public void method1(){
 9
10     }
11     //TestClass2必须实现抽象的method2方法,该方法最早是接口中定义的
12     public int method2(){
13         return 2;
14     }
15
16     //method3方法对于TestClass2来说至关重要,因此必须重写。
17     public boolean method3(){
18         return false;
19     }
20
21     //新增的方法对于TestClass2来说无关紧要,无需知道新增method4的存在
22 }

代码精讲:

    这段代码演示了假如项目已经成型,但是需求有变,我们不得不向接口中增加一个新的方法,假如子类直接实现了接口,那么这些子类都要修改,来实现接口新增的方法。

    但本例中的TestClass1、TestClass2子类没有直接实现接口,而是通过继承抽象类间接实现接口,这样好处一下就体现出来了!

    向接口中新增的方法,可以在实现接口的抽象类中缓冲一下,提供一个默认的实现,这样一来,就不必强制所有的子类(通过继承抽象类间接实现接口的类)都进行修改,可以形象的理解为“没有惊动子类”。而需要使用这个方法的子类,直接重写即可。

时间: 2024-08-28 14:35:12

Java抽象接口技巧(一)的相关文章

2.35 Java基础总结①抽象②接口③设计抽象类和接口的原则④接口和抽象类的区别

java基础总结①抽象②接口③设计抽象类和接口的原则④接口和抽象类的区别 一.抽象 abstract作用:不能产生对象,充当父类,强制子类正确实现重写方法和类相比仅有的改变是不能产生对象,其他的都有,包括构造.属性等等任何一个类只要有一个抽象的方法就成了抽象类 抽象方法 public abstract A();①方法是抽象的,这个类也是抽象的:②子类必须重写抽象方法,除非子类也是抽象类 抽象类可以没有抽象方法,但一般不这么设计 二.接口 interface 接口也是Java的一种引用数据类型(J

Effective Java之接口与抽象

我们知道,Java语言只允许实现单继承,但是可以实现多个接口,抽象类也是类啊,所以一个具体的类只能继承一个抽象类,但是在设计抽象类时,肯定是将相关的功能放在一个抽象类里面的,那么针对某个需要实现多种功能的类来讲,继承多个抽象类是不可能的,在这种情况下,接口提供了高度的灵活性,试想一下,一个接口中基本都是相关的且必须实现的方法,那么当某个类需要实现的功能比较多时,它可以很灵活地指定实现多个接口就行,但这样也有一个缺点,接口里面是不提供实现的,但抽象类里面对于非抽象方法,可以提供实现的过程,那么,如

interface,abstract class,abstract interface Java中的接口,抽象类和抽象接口的异同

接口与抽象类的比较 1.相同点: A. 两者都是抽象类,都不能实例化. B. interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法. 2. 不同点: A. interface需要实现,要用implements,而abstract class需要继承,要用extends. B. 一个类可以实现多个interface,但一个类只能继承一个abstract class. C. interface强调特定功能的实现,而abstract class强调所属关系. D.尽

java性能优化技巧

一.通用篇 "通用篇"讨论的问题适合于大多数 Java应用. 1.1     new 1.1     new 11..11 不用 nneeww关键词创建类的实例 用new 关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用.但如 果一个对象实现了Cloneable 接口,我们可以调用它的clone()方法.clone()方法不会调用任 何类构造函数. 在使用设计模式(Design Pattern)的场合,如果用 Factory模式创建对象,则改用clone() 方法创建新的

内功心法 -- Java标记接口

写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------这篇博客主要来谈谈"Java标记接口"的相关知识,主要内容包括: 1. 概述 2. Serializable 3. Cloneable 4. RandomAccess --------------------------------------------------------------------1.概述 Ja

深入理解Java的接口和抽象类(转)

深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类.下面是本文的目录大纲: 一.抽象类 二.接口 三.抽象类和接口的区别 若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.

(转载)深入理解java的接口和抽象类

本文转自地址:http://www.cnblogs.com/dolphin0520/p/3811437.html 作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类

使用 Eclipse 调试 Java 程序的技巧【9】

若有不正之处,请多多谅解并欢迎批评指正,不甚感激.请尊重作者劳动成果: 本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing/ 本文版权归作者和博客园共有,未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接 ,否则保留追究法律责任的权利. 使用 Eclipse 调试 Java 程序的技巧 不要调试太多 只调试你觉得有问题的代码或者一部分一部分功能的调试: [ 断点视图 : 条件断点] 如果你只对应用中的某部分感

Java的接口和抽象类

深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类.下面是本文的目录大纲: 一.抽象类 二.接口 三.抽象类和接口的区别 若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.