java中抽象类与接口
面向对象的计算机编程语言致力于用简洁的语言描述客观的世界,java便是一个很好的例子。首先来看一个现实生活中的现象:乐器是一个总称,它包含了笛子、小提琴、吉他、古筝等等,这一系列的东西都有一种共性,那就是发声(当然不只是发声)。然而每种乐器的发声方法都不一样。如果要用编程语言去描述这种现象,该怎么去解决呢?
以java为例,java中用抽象类或接口去描述这种关系。可以说抽象类是普通类和接口的一种中庸之道(摘自《Thinking in java》),或者说接口是一种更为“纯粹”的抽象类,因为抽象类中可以包含非抽象类,而接口是绝对不允许的。下面将具体讲述抽象类和接口,相信大家读完后,对其中的联系和区别会有更深的认识。
抽象类
Java用abstract标识抽象类和抽象方法。一旦一个方法被声明为抽象方法,那么它只有方法的声明而没有方法实体,比如:
abstract class Instrument{
String Name;
abstract void play();//抽象类,没有实体
}
就好比乐器“发声”这一功能,在创建乐器时,你并不知道乐器这个抽象的概念是如何发声的,只有具体到某一乐器时(如笛子)才能确定发声方式。
当一个类含有一个或多个抽象方法时,要声明为抽象类(前面用“abstract”声明),抽象类是不可被实例化的,当然也就没有构造方法。只要一个类中包含抽象方法,那么这个类必须被声明为抽象类,即以下两种情况:
1)类中包含一个或多个抽象方法;
2)类实现了一个接口,或者继承了一个抽象类,并且该类没有完全实现所有的抽象类。
比如:
abstract class Test1{
abstract void f1();
abstract void f2();
}
abstract class Test2extends Test1{/*没有完全实现类Test1中所有的抽象类,必须声明为抽象类*/
void f1(){ //没有意义的一个方法,因为该类不能被实例化
System.out.println("Test2");
}
}
class Test3extends Test2{
void f1(){System.out.println("Test3");}
void f2(){};//虽然是空方法体,但毕竟实现了该方法
}
接口(interface)
接下来我再讲讲接口又是嘛玩意。给出一般教材给的定义:是一系列常量定义和抽象方法声明的集合。可能对于初学者,乍一听“接口”这个词,不太能接受,继续往下看便能理解这个叫法了。
上文提到过接口是一种更为“纯粹”的抽象类。纯粹到什么地步,一个接口中,所有的方法都是抽象的,不允许有任何的具体的东西存在(抽象的极端)。接口可以理解成一种极为抽象的特殊类,不过为了和普通类区别开,接口用interface声明。
1接口的特征
(1)接口中所有的变量是public、static、final的,即公有的静态常量;
(2)接口的方法默认都是public、abstract的,即公有的抽象方法;
(3)不能被实例化,但可以定义接口类型的引用变量;
(4)接口允许多重继承,用extends关键词声明父接口,逗号隔开;
2接口的分类
(1)普通接口:含有方法
(2)常量接口:只含有常量
(3)标识接口:没有任何方法和常量
3.接口的实现
接口只能由类实现,用implements关键词声明,一个类可以实现多个接口。类必须实现接口的所有的抽象方法,不然必须声明为abstract,即抽象类。比如:
interface InterfaceTest{
void F1();
void F2();
}
abstract class Aimplements InterfaceTest{/*没有全部实现接口的所有方法,必须声明为抽象类*/
public void F1(){System.out.println("A F1()");}
}
class Bimplements InterfaceTest{
public void F1(){System.out.println("B F1()");}
public void F2(){System.out.println("B F2()");}
}