JAVA基础系列(1)—— 抽象类和接口

1.接口(interface),接口被用来建立类与类之间关联的标准。

Java code
 
public interface ITest{ 
       public void test(); 
} 
public class TestImpl implements ITest{ 
       public void test(){ 
             System.out.println("test"); 
       } 
}



2.抽象类(abstract class),只要类中有一个抽象方法,此类就被标记为抽象类。实际上抽象类除了被继承之外没有任何意义。

区别
1.
接口是公开(public)的,里面不能有私有的方法或变量,是用于让别人使用的,实现接口的一定要实现接口里定义的所有方法。
而抽象类是可以有私有方法或私有变量的,实现抽象类可以有选择地重写需要用到的方法,但是必须实现里面所有的抽象方法。
2.
抽象类在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。
但是,一个类却可以实现多个interface(java中实现多重继承的方法之一)。
3.
抽象类中可以有自己的数据成员,也可以有非abstarct的成员方法。
而在接口中,只能够有静态的不能被修改的数据成员(也就是必须是 static final的,不过在 interface中一般不定义数据成员),而且所有的成员方法都是抽象的。
4.
抽象类和接口所反映出的设计理念不同。
其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。(组合是"has a"关系)
5.
接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。不是很建议具体类直接实现接口的。还有一种设计模式是面向接口编程,而非面向实现编程。

其实接口是抽象类的延伸,可以将它看做是纯粹的抽象类,就是说接口比抽象类还抽象,还有设计接口的目的就是为了实现C++中的多重继承,不过java团队设计的一样更有趣的东西来实现这个功能,那就是内部类(inner class),下一个系列中讲会详细讲解内部类的作用。

Thinking in java里面的内容,有一个很好的例子来诠释究竟什么时候应用抽象类,什么时候应用接口,那就是广泛流传的报警门例子,思考后得到的理解就是上面所说的:抽象类,"is a"关系,抽象出共同的本质特征,单一继承;接口,"like a"关系,个性化特征,多重继承。

不同的门都具有本质特征动作 open(), close()。那么抽象类和接口都可以定义这两个方法。现在要求它具有报警alarm功能。
1) 如果这3个功能都放在抽象类里面,那么所有的门都具备了这3个功能,无疑不妥,有的门不需要报警功能啊!
2) 如果这3个功能都放到接口里面,需要用到报警功能的其他类,就需要实现门的open和close功能,这样子也不对!

所以,应该把门的open, close和alarm分离,让所有的门都有open, close动作,继承抽象类Door。而需要添加报警功能的门,则再继承接口Alarm。
abstract class Door { 
  abstract void open(); 
  abstract void close(); 
} 
 
interface Alarm { 
  void alarm(); 
} 
 
class AlarmDoor extends Door implements Alarm { 
  void open() { … } 
  void close() { … } 
  void alarm() { … } 
} 

可以看出,因为抽象类是用于单一继承,接口是用于多重继承,所以需要这样安排。而同时看到,抽象类就是类的本质特征,共同的;接口是个性化的,你想让类更具个性化,则继承其他相应个性特征的接口。


你可能感兴趣的:(java,设计模式,编程)