一、抽象类

----- 1. 抽象类和抽象方法

抽象类的定义:用 abstract 修饰的普通类叫做抽象类。

为了更好的说明抽象类,我们先定义一个抽象类叫做 AbstractDoor,里面有两个抽象方法 adddelete

Java抽象类和接口的应用实验报告 java抽象类实现接口_接口


于抽象方法而言,它并不需要实现具体的功能。但是抽象类可以包含普通方法。如果你强行给它加上实现,那么它就会倔强地报错,所以抽象方法并不能给其指定方法实体。

Java抽象类和接口的应用实验报告 java抽象类实现接口_java_02


----- 2. 抽象类的继承与抽象方法的重写

为了体现抽象类的作用,我们重新创建了一个Test类来继承我们的抽象类 AbstractDoor

如果我们先不对抽象类中的抽象方法进行操作,Test类下方就会出现报错。

Java抽象类和接口的应用实验报告 java抽象类实现接口_Java抽象类和接口的应用实验报告_03


它说,原本的抽象方法 add 和 delete 必须被 implement(实现)

Java抽象类和接口的应用实验报告 java抽象类实现接口_抽象方法_04


也就是说我们需要在 Test 类中具体实现这两个方法,当我们具体重写继承于抽象类中的抽象方法后,Test 类下方的报错就消失了。

Java抽象类和接口的应用实验报告 java抽象类实现接口_接口_05

或者如果不重写也不想报错,还有一种做法就是将子类也定义为abstract类型

Java抽象类和接口的应用实验报告 java抽象类实现接口_java_06


但同时,抽象类也就不能再被New,也就是不能再创建抽象类的对象,而只能被继承。

Java抽象类和接口的应用实验报告 java抽象类实现接口_接口_07

----- 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 类型的;

④ 抽象类不允许多重继承,接口允许 多重继承

三、总结

由于接口的多继承性和可实现性,相对于一个子类只能继承一个父类来说,更易于维护和修改,有更大的可扩展性。

而抽象类则需要抽象出各种子类公共的部分,不易于改动,更适合充当各种公共属性、方法的角色。