Java中的接口与抽象类的区别

抽象类

抽象类的作用与C++类似,不能实例化。只能通过子类继承,再进行实例化。一般是为了确定一种统一的抽象格式。

// 定义的抽象类
abstract class AbsClass{
    abstract void myName(); // 一个抽象方法

    void print(){
        System.out.println("play method !");
    }
}

// 继承并实现抽象方法
class myClass1 extends AbsClass{
    void myName(){
        System.out.println("class1");
    }
}

class myClass1 extends AbsClass{
    void myName(){
        System.out.println("class2");
    }
}

class Test{
    // 实例化
    myClass1 c1;
    myClass1 c2;
    // 测试
    public static void main(){
        c1.myName();
        c1.print();
        c2.myName();
        c2.print();
    }
}

接口

接口是一种方法的抽象,而不是类。

interface Method1{
    abstract void print();
}

interface Method2{
    abstract void show();
}

// 同时实现两个方法
class myClass1 implements Method1,Method2{
    void print(){
        System.out.println("print class 1");
    }

    void show(){
        System.out.println("show class 1");
    }
}

class myClass2 implements Method1,Method2{
    void print(){
        System.out.println("print class 2");
    }

    void show(){
        System.out.println("show class 2");
    }
}

class Test{
    myClass1 c1;
    myClass2 c2;

    public static void main(){
        c1.print();
        c1.show();
        c2.print();
        c2.show();
    }
}

二者的区别与联系

举一个很经典的例子,也在其他教程中非常常见的例子。假设有一个抽象类,表示门

abstract class Door{
    public abstract void open();
    public abstract void close();
}

现在,假设我们要实现一个防盗门的实例,仅需要继承并且实现这个抽象类即可:

class AntiTheftDoor extends Door{
    public void open(){
    //  一些实现方法
    }
    public void close(){
    // 一些实现方法
    }
    /*
    ···一些其他属性
    */
}

如果使用接口的话,可以这样定义:

interface Door{
    public abstract void open();
    public abstract void close();
}

之后进行方法的实现:

class AntiTheftDoor implements Door{
    public void open(){
    //  一些实现方法
    }
    public void close(){
    // 一些实现方法
    }
    /*
    ···一些其他属性
    */
}

如果我们想要一个门添加报警的方法,有下面几个选项:

  1. 直接在抽象类中声明一个报警方法,但是不是所有的门都需要这个方法。
  2. 在方法中添加一个报警功能,但是不是所有有报警功能的东西都是门,比如说放到警报。

正确的实现方法应该这样:

// 门的抽象类
abstract class Door{
    public abstract void open();
    public abstract void close();
}

// 报警的抽象方法
interface Alarm{
    void alarm();
}

class AntiTheiftDoor extends Door implements Alarm{
    public void open(){
    //  一些实现方法
    }
    public void close(){
    // 一些实现方法
    }
    void alarm(){
    // 一些实现方法
    }
}

猜你喜欢

转载自blog.csdn.net/qq_35976351/article/details/80071528
今日推荐