接口和抽象类是支持抽象类定义的两种机制。
接口:如果一个抽象类的所有方法都是抽象方法,则可以把这个类用另外一种形式来定义,即接口。Java接口是一系列方法的声明,是一些方法特征的集合,但是在接口中声明的方法默认是抽象的。(即只有方法标识符,而没有方法体)。
抽象类:拥有抽象方法的类就是抽象类,抽象类要使用abstract关键字声明。
接口:
声明接口,使用关键字interface,接口中所有方法都只声明方法标识,而不去声明具体方法体,具体的方法体的实现由继承该接口的类来去实现。接口中的属性默认为Public、Static、Final。一个类实现某接口必须实现这个接口中定义的所有的抽象方法。
一个简单的接口:只能有抽象方法。
public interface XiugouImp {
final int zhuazi=5;//全局变量
public abstract void jiaohuan();
}
使用implements关键词实现接口:
class test implements xiugouimp {
@Override
public void jiaohuan(){
System.out.println("xiaosongxv");
}
}
只有把接口的抽象方法都实现才算是这个类实现了这个接口。
抽象类:
普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法、普通方法、static方法、常量和变量等内容。而抽象类是指在普通类的结构里面增加抽象方法的组成部分。
那么什么叫抽象方法呢?
在所有的普通方法上面都会有一个“{}”,这个表示方法体,有方法体的方法一定可以被对象直接使用。而抽象方法,是指没有方法体的方法,同时抽象方法还必须使用关键字abstract做修饰。
而拥有抽象方法的类就是抽象类,抽象类要使用abstract关键字声明。
定义一个简单的抽象类:一定拥有抽象方法,可以拥有普通方法。
abstract class xiugou{
//定义一个抽象类必须用关键字abstract
public void fun(){
//普通方法:存在方法体
System.out.println("我是普通方法~");
}
public abstract void biubiu();
//抽象方法,没有方法体,有abstract关键字做修饰
}
实现抽象方法:
class heihei extends xiugou{//heihei类是抽象类xiugou的子类,是一个普通类
@Override
public void biubiu() {//强制要求覆写
System.out.println("Hello World !");
}
}
要明确:
(1)抽象类继承子类里面有明确的覆写要求,而普通类可以有选择性的来决定是否需要覆写;
(2)抽象类实际上就比普通类多了一些抽象方法而已,其他组成部分和普通类完全一样;
(3)普通类对象可以直接实例化,但抽象类的对象必须经过向上转型之后才可以得到。
public class Test {
public static void main(String[] args) {
xiugou a = new heihei();//向上转型
a.biubiu();//被子类所覆写的过的方法
}
}
接口和抽象类相同点:
(1)抽象类和接口都不能直接实例化,即创建对象。
(2)抽象类的子类(或接口的实现类),都必须对抽象类(或接口)中所列全部的抽象方法提供具体实现,才可以被实例化,否则,该类仍然为抽象类。
不同点:
(1)抽象类内部可能包含非final的变量,但是在接口中存在的变量一定是final,public,static的。
(2)抽象类关键字:abstract class,接口关键字:interface。实现接口的关键字:implements,继承抽象类的关键字:extends;
(3)一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承;
(4)抽象方法只能存在于抽象类或者接口中,但抽象类中却能存在非抽象方法,即有方法体的方法。接口是百分之百的抽象类;
(5)抽象类只能被类或抽象类继承,而接口既可以被接口继承,也能被类或抽象类实现;
(6)接口被用于常用的功能,便于日后维护和添加删除,而抽象类更倾向于充当公共类的角色,不适用于日后重新对立面的代码修改。功能需要累积时用抽象类,不需要累积时用接口。