有的时候需要将接口和抽象类配合起来使用,这样可以为开发者提供相当的便利性,开发者觉得哪个方便就选用哪个。这样的抽象类称为便利类。此时,便利类并不需要实现接口的所有方法,可以留给继承它的子类去实现它们。
抽象父类提供给子类一个方法,主要是起规范作用,你不写父类这个方法也行。
如果是接口的话,子类就一定要复写父类所有的抽象方法。
-----------------------------------------------------------------------------
当你自己写的类中想用某个接口中个别方法的时候(注意:不是所有的方法),肿么办?
那么你就可以用一个抽象类先实现这个接口(注意:仅仅是空实现:方法体为空),然后再用你的类继承这个抽象类,在你的类中用哪个方法就实现哪个方法,这样就可以达到目的了;
如果你直接用类实现接口,那接口的所有方法都必须实现的。
示例代码如下:
问题:
接口(方法比较多) --> 实现类(我仅仅是使用其中的一个方法,也得把其他的方法给实现了,哪怕是空实现)
1 package cn.itcast_03; // 接口 2 3 /* 4 * 针对用户操作的四种功能的接口 5 */ 6 public interface UserDao { 7 public abstract void add(); 8 9 public abstract void delete(); 10 11 public abstract void update(); 12 13 public abstract void find(); 14 }
1 package cn.itcast_03; // 实现类 2 3 public class UserDaoImpl implements UserDao { 4 5 @Override 6 public void add() { 7 System.out.println("添加功能"); 8 } 9 10 @Override 11 public void delete() { 12 System.out.println("删除功能"); 13 } 14 15 @Override 16 public void update() { 17 System.out.println("修改功能"); 18 } 19 20 @Override 21 public void find() { 22 System.out.println("查找功能"); 23 } 24 25 }
1 package cn.itcast_03; // 测试类 2 3 /* 4 * 问题: 5 * 接口(方法比较多) --> 实现类(我仅仅是使用其中的一个方法,也得把其他的方法给实现了,哪怕是空实现) 6 */ 7 public class UserDaoTest { 8 public static void main(String[] args) { 9 UserDao ud = new UserDaoImpl(); 10 ud.add(); 11 // 该实现类里面实现了四种功能,我仅仅使用一种功能,可是我并不需要实现这么多功能啊!肿么办? 12 13 } 14 }
解决方案:
接口(方法比较多) --> 适配器类(实现接口,仅仅是空实现:方法体为空) --> 实现类(用哪个方法就重写哪个方法)
注意:
适配器类是抽象类。
实现有两种:一种是真正的实现,即方法体里面有内容;另一种是空实现,方法体里面没有内容。
情况1:如果适配器类仅仅是实现了接口,但是并不提供方法的空实现。则适配器类没有起到作用,实现类还是要重写接口的所有方法。问题同上了。(虚晃一枪啊)
情况2:如果适配器类不仅是实现了接口,还提供了方法的空实现。则适配器类就起到作用了,实现类中用哪个方法就重写哪个方法。达到目的!
以下是情况2的示例代码:
1 package cn.itcast_03; // 接口 2 3 /* 4 * 针对用户操作的四种功能的接口 5 */ 6 public interface UserDao { 7 public abstract void add(); 8 9 public abstract void delete(); 10 11 public abstract void update(); 12 13 public abstract void find(); 14 }
1 package cn.itcast_03; // 适配器类 2 3 public abstract class UserAdapter implements UserDao { 4 5 @Override 6 public void add() { 7 } 8 9 @Override 10 public void delete() { 11 } 12 13 @Override 14 public void update() { 15 } 16 17 @Override 18 public void find() { 19 } 20 21 }
1 package cn.itcast_03; // 实现类 2 3 public class UserDaoImpl2 extends UserAdapter { 4 @Override 5 public void add() { 6 System.out.println("添加功能"); 7 } 8 9 }
1 package cn.itcast_03; // 测试类 2 3 /* 4 * 解决方案: 5 * 接口(方法比较多) --> 适配器类(实现接口,仅仅是空实现:方法体为空) --> 实现类(用哪个方法就重写哪个方法) 6 */ 7 public class UserDaoTest { 8 public static void main(String[] args) { 9 UserDao ud2 = new UserDaoImpl2(); 10 ud2.add(); 11 } 12 }
我的GitHub地址: https://github.com/heizemingjun
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】