java中抽象类实现接口的小技巧

本文讲解了如何使用抽象类来实现接口,特别是当不需要实现接口中的所有方法时。通过示例说明了如何过滤掉不必要的方法,使具体实现类更加简洁。
1.抽象类肯定可以实现接口; 

2.这不是有没有意义的事情,是一种思想,当你自己写的类想用接口中个别方法的时候(注意不是所有的方法),那么你就可以用一个抽象类先实现这个接口(方法体中为空),然后再用你的类继承这个抽象类,这样就可以达到你的目的了,如果你直接用类实现接口,那是所有方法都必须实现的;

3.抽象类定义在接口与真正的实现类之间有一个重要的作用,就是过滤掉一些不需由真正的实现类重写的方法。举一个例子,譬如说HttpServlet这个抽象类类中有init(),doGet(),doPost(),destroy()等方法,但是真正要让程序员实现的只有doGet(),doPost(),就是因为HttpServlet中定义了对一些方法的默认实现,这样一个类在扩展它时,就不必重写所有HttpServlet或者其父类所实现的所有接口的所有方法。经常是这样,即使我们重写init()方法,也只是调用super.init().

总结一句:抽象类中已经实现了的接口中方法,在他的子类中则不需要再实现。子类只实现抽象类中没有实现的接口中的方法以及抽象类自身的抽象方法。依据此 才能实现抽象类实现接口的诸多技巧。

通过下面例子,可以很好的理解:

      例:有一个接口Window,有三个方法,draw(),putColor(),setPosition()三个方法,程序员在设计页面时只关注对其进行位置定位(画图draw()和着色putColor()则由美工实现),所以他只需要实现setPosition()方法,而其余两个不用实现。则设计如下:

      //接口

      interface Window{

             public void draw();

             public void putColor();

             public void setPosition();

      }

 

     /**

      *抽象类,不实现需要的方法。而实现的不需要的方法的方法体设为空,

      */    

     abstract class DesignedPage implements Window{

             public void draw(){}

             public void putColor(){}

     }

     

     /**

       * 具体实现类,实现特定的方法,该类中只有需要的方法

       */

      public class DesingedPageA  extends DesignedPage{

             public void setPosition(){

                   //set the window position

             }   

    }

 

  

     通常情况下,如果我们需要在具体实现类中实现draw()方法时,都是调用父类的draw()方法(super.draw())。


### Java 面向对象 抽象类接口 的练习题 以下是几个基于抽象类接口设计的综合性练习题,旨在帮助理解并掌握这些核心概念。 #### 练习题一:标准 `Player` 类的设计 创建一个名为 `Person` 的普通类,其中包含两个属性:`name` 和 `age`。在此基础上定义一个抽象类 `Player`,该类继承自 `Person` 并提供以下功能: - 提供无参构造器以及带参数的构造器。 - 定义一个抽象方法 `study()` 表示学习行为[^3]。 进一步扩展此场景,在程序中实现具体的玩家类 `StudentPlayer` 或者 `TeacherPlayer` 来覆盖父类中的抽象方法,并测试其运行效果。 --- #### 练习题二:手机功能模拟 构建一个简单的手机功能模型,其中包括以下几个部分: 1. **抽象基类** 创建一个抽象类 `Handset`,表示所有手机共有的基本特性。它应该具有品牌 (`brand`) 和型号 (`type`) 属性,并且至少有一个抽象方法用于描述手机的核心操作 (比如拨打电话)[^4]。 2. **具体实现类** 编写一个普通的手机类 `CommonHandset` 实现上述抽象类的功能。此外还需要完成额外的任务,例如发送短信、播放音乐等功能。 3. **接口支持多媒体功能** 设计一个接口 `PlayWiring`,规定任何实现了它的设备都必须具备播放音频文件的能力。让之前提到的具体手机类也去实现这一接口。 通过以上步骤可以全面考察学生对于抽象层次划分的理解程度及其实际应用能力。 --- #### 练习题三:动物王国案例分析 假设我们要开发一款游戏软件来管理各种类型的虚拟宠物,则可以通过如下方式组织代码结构: 1. 建立基础接口 `AnimalAction` ,声明通用的行为动作如进食(`eat`)、移动(`move`)等; 2. 构造抽象超类 `AbstractPet` 添加共同的数据成员变量(名称、健康状态等等),同时给出默认版本的部分业务逻辑; 3. 对于每种特定种类的小动物分别派生独立子类别,各自重新定义那些未被完全指定下来的函数原型实例化过程即可满足需求。 这种模式非常适合用来训练初学者如何合理运用面向对象编程原则解决问题的同时还能加深他们对继承机制的认识水平。 ```java // AnimalAction.java public interface AnimalAction { void eat(); void move(); } // AbstractPet.java import java.util.Random; public abstract class AbstractPet implements AnimalAction{ protected String name; private double healthStatus; public AbstractPet(String petName){ this.name = petName; Random rand=new Random(); setHealthStatus(rand.nextDouble()*100); } public final void showInfo(){ System.out.printf("%s 当前生命值:%f\n",getName(),getHealthStatus()); } // Getters & Setters omitted here... } ``` --- ### 总结 以上三个例子涵盖了从简单到复杂不同难度等级下的实践机会,能够有效检验学习者的理论知识转化成实战技巧的效果怎样。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值