用抽象类来实现接口的意义

用抽象类来实现接口的意义

抽象类和接口都是java中用来实现多态的方法,在此主要说明为什么会用抽象类来实现接口,因此对两者之间的异同就不介绍了。

在java一般的用法中,如果要用普通类来实现接口,则必须实现该接口中的所有方法,这样就会导致需要实现多余的方法;

采用抽象类来实现方法,可以实现该接口中的部分方法,而且当其他类继承该抽象类时,只需要实现抽象类中未实现的方法即可。

例:抽象类B只实现了接口A中的方法a、b,

当类C继承类B时,只需要实现B中未实现的接口c即可。

一般情况下,类C中的方法a、b都是调用父类B的方法a、b。

另外:接口种没有构造方法,抽象类可以有构造方法。

Java抽象类

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。

由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。

父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。

在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。

接口定义方法,抽象类定义公共部分!比如装修:接口定义装修步骤,抽象类直接把公共部分,比如,旧房拆墙等(构造函数)、刷墙的具体实现都写好了。

看下边的代码:

package com.testlab;

/**
 * 定义了该系列类的抽象步骤.比如步骤一是什么、步骤二是什么.
 * 主要解决的是明确要干什么的问题.
 */
public interface CheckAbsInterface {
    void print();
}
package com.testlab;

/**
 * 1、继承了接口,明确了步骤.
 * 2、继续定义了系列类的公共部分,比如构造函数的初始化,系列类的共有部分,并实现.
 */
abstract class CheckAbsClass implements CheckAbsInterface{
    private String name;

    public CheckAbsClass(String name){
        this.name = name;
        System.out.println("Hi,I am "+this.name+"!");
    }

    protected void beforePrint(){
        System.out.println("before print......");
    }
}
package com.testlab;

/**
 * 继承了抽象类,拥有了系列类的公共能力,并且明确了后续要自己定义的能力(需要override的部分).
 */
public class ACheckAbsClass extends CheckAbsClass{
    public ACheckAbsClass(String name){
        super(name);
    }

    @Override
    public void print() {
        beforePrint();
        System.out.println("print a!");
    }
}
package com.testlab;

public class BCheckAbsClass extends CheckAbsClass{
    public BCheckAbsClass(String name){
        super(name);
    }

    @Override
    public void print() {
        super.beforePrint();
        System.out.println("print b!");
    }
}
package com.testlab;

public class CheckAbsClassResult {
    public static void main(String[] args) {
        ACheckAbsClass aac = new ACheckAbsClass("AA");
        aac.print();

        BCheckAbsClass bac = new BCheckAbsClass("BB");
        bac.print();
    }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注