一、接口
接口是一系列方法的声明,是一些方法特征的集合,关键字interface、一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具不同的行为(功能)。java中接口不是类,不能使用new的方法实例化一个接口。但是可以对接口变量进行声明 Comparable X;
Java接口的方法只能是抽象的和公开的,Java接口不能有构造器,Java接口可以有public、静态的和final属性。即接口中的属性可以定义为public static final int value=5;
接口中的方法默认都是 public abstract 类型的。接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
1.1 定义一个接口
使用interface来定义一个接口。接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成。定义接口的基本格式如下:
[修饰符] interface 接口名 [extends 父接口名列表]{
[public] [static] [final] 常量;
[public] [abstract] 方法;
}
修饰符:可选,用于指定接口的访问权限,可选值为public。如果省略则使用默认的访问 权限。
接口名:必选参数,用于指定接口的名称,接口名必须是合法的Java标识符。一般情况下, 要求首字母大写。
extends 父接口名列表:可选参数,用于指定要定义的接口继承于哪个父接口。当使用extends关键字时,父接口名为必选参数。
方法:接口中的方法只有定义而没有被实现。
例如,定义一个用于计算的接口,在该接口中定义了一个常量PI和两个方法,具体代码如下:
public interface CalInterface {
final float PI=3.14159f;//定义用于表示圆周率的常量PI final float PI = 3.
float getArea(float r); // 定义一个计算面积的方法
float getCircumference(float r);//定义一个用于计算周长的方法
}
注意:
与Java的类文件一样,接口文件的文件名必须与接口名相同。
二、抽象类
在java中,含有abstract修饰符的class即为抽象类,abstract类不能创建实例对象,含有abstract的方法的类定义为abstract class ,但是abstract class里的方法不能是抽象的,抽象中定义抽象方法必须放在具体子类中实现。
抽象方法只有声明,没有具体的是实现。抽象方法的声明格式为:
public abstract class ClassName {
abstract void fun();
}
从这里看出抽象类就是为了继承而存在,如果你定义了一个抽象类却不去继承它那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。
包含抽象类方法的类称为抽象类,但并不意味着抽象类中只有抽象方法,它和普通类一样,同样可以拥有成员变量和普通成员方法。注意:抽象类和普通类的主要三点区别:
(1).抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
(2).抽象类不能用来创建对象
(3).如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为abstract类。
三、接口和抽象类的区别
(1).抽象类中可以有构造方法,但是接口内不能有构造方法。
(2).抽象类中可以普通成员变量,而接口中不能有普通成员变量。
(3).抽象类中可以包含非抽象的普通方法,而接口中所有的方法必须是抽象的,不能有非抽象方法。
(4).抽象类中的抽象方法的访问类型可以是public ,protected和默认类型,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
(5).抽象类中可以包含静态方法,但是接口中不能包含静态方法。
(6).抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static类型,并且默认为public static类型。
(7).一个类可以实现多个接口,但只能继承一个抽象类。
(8).接口更多的是用来定义模块之间的通信,而抽象类主要实现代码的重用。