3.4Java语言的抽象类(Abstract)和接口(Interface)

1.抽象类(Abstract Class)

类是对象的抽象,抽象类是类的更高一个层次的抽象。

abstract class ClassName {
    abstract type methodName(parameter);
}
  1. 抽象类与类一样,只支持单继承,从抽象类继承的子类必须实现抽象方法。
  2. 抽象类不能实例化,也就是说不能使用 new 关键字创建对象。
  3. 抽象类中不一定包含抽象方法,但是包含抽象方法的类必须被定义为抽象类。
  4. abstract 修饰的方法是抽象方法,它只有定义,没有实现。
  5. abstract 修饰符只能用于普通方法,不能用于 static 方法或者构造方法。
  6. abstract 修饰的抽象方法时不能使用 private 修饰,否则子类是无法重写的。

重写(Overriding)

class Person {
    public void run() { … }
}

class Student extends Person {
    @Override
    public void run() { … }
}

class Teacher extends Person {
    @Override
    public void run() { … }
}

2.接口(Interface)

抽象类是从多个类中抽象出来的模板,如果将这种抽象进行的更彻底(接口不能定义实例字段),则可以提炼出一种更加特殊的“抽象类”——接口(Interface)。

因为接口不可以被实例化,所以接口不能拥有实例字段,接口所声明的成员变量全部是静态常量,即便是变量不加public static final修饰符也是静态常量。

Java 8之前接口中只有抽象方法,而Java 8之后接口中也可以声明具体方法,具体方法通过声明默认方法实现。

interface InterfaceName {
    //常量前的修饰符可省略
    [public] [static] [final] type CONSTANT_NAME = value;
    //抽象方法、静态方法、默认方法
    [public] [abstract] [static] [default] type methodName(parameter);
}

2.1接口的种类

接口分为两种:普通接口(normal interface)和注解类型(annotation type)。

2.2接口的继承

一个类只能继承自另一个类,不能从多个类继承。但是,一个interface可以使用extends继承多个interface

虽然接口重写,并没有实际意义,但就像类一样,接口也支持方法重写功能。

例如:

interface Hello {
    void hello();
}

interface Person extends Hello {
    void run();
    String getName();
}

2.3接口的实现(implements)

一个类可以使用implements实现一个或多个interface后。

这个类必须完全实现这些接口里所定义的全部抽象方法(除默认方法和静态方法);否则,该类将保留从父接口那里继承到的抽象方法,该类也必须定义成抽象类。

实现接口时接口中原有的抽象方法在实现类中必须实现。默认方法可以根据需要有选择实现(覆盖)。静态方法不需要实现,实现类中不能拥有接口中的静态方法。

//InterfaceA.java文件
package com.a51work6;

public interface InterfaceA {
    void methodA();
    String methodB();
    // 默认方法
    default int methodC() {
        return 0;
    }
    // 默认方法
    default String methodD() {
        return "这是默认方法...";
    }
    // 静态方法
    static double methodE() {
        return 0.0;
    }
}
//ABC.java文件
package com.a51work6.imp;

import com.a51work6.InterfaceA;

public class ABC implements InterfaceA {
    @Override
    public void methodA() {
    }
    @Override
    public String methodB() {
        return "实现methodB方法...";
    }
    @Override
    public int methodC() {
        return 500;
    }
}

2.4接口的变量

接口不是类,所以不能通过new运算符来实例化一个接口,但可以声明接口的变量。

//接口Comparable
Comparable x;
//Employee实现了接口Comparable
x = new Employee();

3.抽象类和接口的作用

抽象类的目的是作为子类的模板设计,是类的更进一步抽象。

接口的目的是 Java 为单继承灵活性不足所作的补充,因为一个类可以实现多个接口。

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/java/javabasic/2488.html

发表评论

登录后才能评论