[原创]Abstract class与Interface
[watermark] 抽象类与接口在用法上有很多相似处,因此我觉得有必要归纳了一下。
抽象方法是指只有声明,没有实现的方法。具有一个或多个抽象方法的类就成为了抽象类。抽象类本身不能被实例化,只有继承了该抽象类并声明了抽象方法的子类才能被实例化,不然其子类也只能成为抽象类。
接口与抽象类的功能差不多,但接口不能定义变量只能定义常量。抽象类和接口虽然都有抽象方法,但是抽象类还可以有其他的方法,接口则不行。可以说接口是特殊的抽象类。
相同行为的方法可以声明为一个接口的形式,并用不同的类对其进行实现。但接口有其限制,它不能提供方法的实现,因此一个接口中的每个方法都必须显式地实现接口中声明的所有方法。有时候这些方法代表着不变的功能,但也必须在每个实现类中实现这些方法,将会导致代码冗余。此时可以使用抽象类来消除代码冗余。
比如不同的银行账户类型:
A.所有银行账户都允许
1)存款
2)余额查询
B.储蓄账户
1)不允许开支票
2)不收取服务费
C.支票帐户
1)允许开支票
2)收取服务费
可以考虑设计如下的类:
银行账户类- public abstract class Account
- {
- String name;
- String ID;
- double money;
- public Account(String name,String ID)
- {
- this.name=name;
- this.ID=ID;
- }
- public String getName()
- {
- return name;
- }
- public String getID()
- {
- return ID;
- }
- public String query()
- {
- String str="Name:"+getName()+"ID"+getID()+money;
- System.out.println(str);
- }
- public abstract boolean UseCheck();
- public abstract boolean isCharge();
- }
复制代码 储蓄账户类- public class Depositor extend Account
- {
- public boolean UseCheck()
- {
- return false;
- }
- public boolean isCharge()
- {
- return false;
- }
- }
复制代码 支票账户类- public class ChequeUser extend Account
- {
- public boolean UseCheck()
- {
- return true;
- }
- public boolean isCharge()
- {
- return true;
- }
- }
复制代码 如果要增加一个功能比如判断用户是否能收取利息,储蓄账户有利息而支票帐户没有利息,可以用如下接口:- public interface Accrual
- {
- public boolean HasAccrual();
- }
复制代码- public class Depositor extend Account implements Accrual
- {
- public boolean UseCheck()
- {
- return false;
- }
- public boolean isCharge()
- {
- return false;
- }
-
- public boolean HasAccrual()
- {
- return true;
- }
- }
复制代码- public class ChequeUser extend Account implements Accrual
- {
- public boolean UseCheck()
- {
- return true;
- }
- public boolean isCharge()
- {
- return true;
- }
- public boolean HasAccrual()
- {
- return false;
- }
- }
复制代码 由此可以看出接口用得好的话,扩展系统的功能比较方便
[/watermark] |