一、抽象类
抽象类的作用类似模板,其目的是要设计者根据他的格式来修改并创建新的类。但是并不能够有抽象类直接创建对象,只能够通过抽象类派生出新的类,再由它来创建对象。但是在抽象类的使用中同样存在单继承的局限,即一个子类只能够继承一个抽象类。
抽象类的定义及使用规则如下:
1)包含一个抽象方法的类必须是抽象类
2)抽象类和抽象方法都要使用abstract关键字声明
3)抽象方法只需要声明而不需要实现
4)抽象类必须被子类继承,子类(如果不是抽象类)必须覆写抽象类中的全部抽象方法
示例代码:
abstract class A {
public abstract void print();
public void getInfo(){
System.out.println("info...");
}
}
class B extends A {
public void print(){
System.out.println("subclass B...");
}
}
public class AbstractDemo {
public static void main(String[] args) {
B b = new B();
b.print();
b.getInfo();
}
}
注意问题:
1)一个抽象类不可以用final关键字类声明,因为抽象类是必须被子类覆写的,如果使用final关键字声明,那么此类就不可以被子类继承
2)抽象类可以定义构造方法,抽象类依然使用的是类的继承关系,而且抽象类中也存在各个属性,所以子类在实例化之前必须先对父类进行实例化
3)抽象方法不要使用private关键字声明,否则子类无法覆写该抽象方法
二、接 口
接口是Java中最重要的概念之一,它可以被理解为一种特殊的类,是由全局常量和公共的抽象方法组成,在接口中抽象方法必须定义为public访问权限。在接口中如果不写public,则也是public访问权限。
interface A {
String AUTHOR = "张三"; //等价于:public static final String AUTHOR = "张三";
void print(); //等价于:public abstract void print();
String getInfo(); //等价于:public abstract String getInfo();
}
和抽象类一样,接口若要使用也必须通过子类,子类通过implements关键字实现接口,一个子类可以实现多个接口,从而摆脱了Java单继承的局限性Java中接口是不允许继承抽象类的,但是一个接口可以继承多个接口
三、总 结
序号 | 区别点 | 抽象类 | 接口 |
1 | 定义 | 包含一个抽象方法的类 | 全局常量和公共抽象方法的集合 |
2 | 组成 | 构造方法、抽象方法、普通方法、常量、变量 | 常量、抽象方法 |
3 | 使用 | 子类继承抽象类(extends) | 子类实现接口(implements) |
4 | 关系 | 抽象类可以实现多个接口 | 接口不允许继承抽象类,但是可以继承多个接口 |
5 | 常见设计模式 | 模板设计 | 工厂设计、代理设计 |
6 | 对象 | 都通过对象的多态性产生实例化对象 | |
7 | 局限 | 抽象类有单继承的局限 | 接口没有此局限 |
8 | 实际 | 作为一个模板 | 作为一个标准或表示一种能力 |
9 | 选择 | 如果抽象类和几口都可以使用,则优先使用接口,避免单继承的局限 | |
10 | 特殊 | 一个抽象类中可以包含多个接口,一个接口中可以包含多个抽象类 |