一、抽象类
----- 1.
抽象类和抽象方法
抽象类的定义
:用 abstract
修饰的普通类叫做抽象类。
为了更好的说明抽象类,我们先定义一个抽象类叫做 AbstractDoor
,里面有两个抽象方法 add
和 delete
。
于抽象方法而言,它并不需要实现具体的功能。但是抽象类可以包含普通方法。如果你强行给它加上实现,那么它就会倔强地报错,所以抽象方法并不能给其指定方法实体。
----- 2.
抽象类的继承与抽象方法的重写
为了体现抽象类的作用,我们重新创建了一个Test类来继承我们的抽象类 AbstractDoor
。
如果我们先不对抽象类中的抽象方法进行操作,Test类下方就会出现报错。
它说,原本的抽象方法 add 和 delete 必须被 implement(实现)
。
也就是说我们需要在 Test 类中具体实现这两个方法,当我们具体重写继承于抽象类中的抽象方法后,Test 类下方的报错就消失了。
或者如果不重写也不想报错,还有一种做法就是将子类也定义为abstract类型
但同时,抽象类也就不能再被New,也就是不能再创建抽象类的对象,而只能被继承。
----- 3.
抽象类的意义
所以,我们会发现实际上抽象类和普通的类并无太大的差别,但是如果一个子类继承于一个抽象类,就必须重写父类中的抽象方法。
抽象类它能够帮助我们明确这个类中具体抽象了哪些方法,且必须要去实现哪些方法,本质上更像一种重构工具。
二、接口
----- 1.
接口的定义
接口是一个抽象方法的集合,接口类型以 interface
进行修饰。
且接口中的 变量
默认为 public static final
,而 方法
则默认为 public abstract
。
----- 2.
接口之间的继承与接口实现
在接口的实现过程中,我们会发现接口与抽象类有很多相似点
,为了更好的理解接口,以下这段代码将各种关系都表示了一遍:
/** 接口和抽象方法的声明 */
interface Operation {
public void add();
public void delete();
public void check();
}
interface OperationTwo {
public void update();
}
/** 接口的继承 */
interface Op extends Operation {
public void work();
}
/** 接口的多重继承 */
interface Op2 extends Operation,OperationTwo {
}
/** 使用 implements 关键字实现接口 */
class ImplementsOfOperation implements Operation {
public void add() {
System.out.println("添加");
}
public void delete() {
System.out.println("删除");
}
public void check() {
System.out.println("检查");
}
}
/** 实现继承后的接口Op */
class ImplementsOfOp implements Op {
public void add() {
System.out.println("添加");
}
public void delete() {
System.out.println("删除");
}
public void check() {
System.out.println("检查");
}
public void work() {
System.out.println("工作");
}
}
/** 一个类实现多个接口 */
class Implements implements Operation, OperationTwo {
public void add() {
System.out.println("添加");
}
public void delete() {
System.out.println("删除");
}
public void check() {
System.out.println("检查");
}
public void update() {
System.out.println("更新");
}
}
/** 测试类 */
public class Test {
public static void main(String[] args) {
ImplementsOfOperation a = new ImplementsOfOperation();
ImplementsOfOp b = new ImplementsOfOp();
Implements c = new Implements();
a.add();
a.delete();
a.check();
b.add();
b.delete();
b.check();
b.work();
c.add();
c.delete();
c.check();
c.update();
}
}
在实现接口的过程中,符合以下三个规则:
① 接口和接口之间也可以继承。
② 一个类只能继承一个父类,但是却能实现 多个接口
。
③ 不管是接口的继承还是一个类实现多个接口,每个接口中的抽象方法都需要被实现。
----- 3.
接口和抽象类的区别
我们会发现接口类型和抽象类很像,但是也有一定的区别。
① 由于接口的方法默认为 public abstract
类型,所以接口中的方法均属于抽象方法,但是抽象类中既可以包含抽象方法,也可以包含普通方法。
② 抽象类只能被继承,但是接口既可以被 继承
也可以被 实现
。
③ 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final
类型的;
④ 抽象类不允许多重继承,接口允许 多重继承
。
三、总结
由于接口的多继承性和可实现性,相对于一个子类只能继承一个父类来说,更易于维护和修改,有更大的可扩展性。
而抽象类则需要抽象出各种子类公共的部分,不易于改动,更适合充当各种公共属性、方法的角色。