文章目录

  • 抽象类
  • 接口
  • 总结对比


抽象类

Java接口是一种特殊的抽象类,它仅包含抽象方法和常量,没有实例变量和构造函数。接口定义了一组规则,任何类都可以实现这些规则,从而成为该接口的实现类。接口的主要作用是为实现类提供一组公共的方法声明,以便实现类能够提供相似的行为。接口也可以看做是一个契约,它规定了实现类必须实现哪些方法。

Java接口的定义方式如下:

public interface 接口名 {
    // 常量定义
    public static final 类型 常量名 = 值;

    // 抽象方法定义
    public abstract 返回值类型 方法名(参数列表);

    // 默认方法(Java 8 新增)
    public default 返回值类型 方法名(参数列表) {
        // 方法体
    }

    // 静态方法(Java 8 新增)
    public static 返回值类型 方法名(参数列表) {
        // 方法体
    }
}

接口中的所有方法都是抽象方法,因此不需要使用 abstract 关键字来修饰。接口中的常量必须是 public、static、final 修饰的,因为接口中所有的属性都默认为 public、static、final。接口中可以定义默认方法和静态方法,这两种方法都可以有方法体,但是默认方法必须使用 default 关键字来修饰,而静态方法必须使用 static 关键字来修饰。

实现一个接口的类必须使用 implements 关键字,该类必须实现接口中的所有抽象方法,否则该类必须是抽象类。接口的实现方式如下:

public class 类名 implements 接口名 {
    // 实现接口中的抽象方法
}

一个类可以实现多个接口,这样可以实现多重继承。例如:

public class 类名 implements 接口名1, 接口名2, ... {
    // 实现接口中的抽象方法
}

接口的使用可以提高程序的扩展性和灵活性,可以让程序更容易地适应变化。在实现类的实例化时,可以通过接口来引用实现类对象,从而更方便地调用实现类中的方法。同时,接口还可以作为多个实现类之间的通用接口,从而实现程序的重用性。

接口

Java抽象类是一种特殊的类,它不能被实例化,只能被继承。它是通过使用抽象方法定义接口来实现对相关类的共同行为进行建模的一种机制。抽象类可以包含非抽象方法和抽象方法,其中抽象方法是没有实现体的方法,必须由子类实现。

抽象类的定义使用关键字abstract来标识。如果一个类包含一个或多个抽象方法,则必须将该类定义为抽象类。抽象类可以继承自另一个抽象类或具体类,并可以被具体类继承。

抽象类的作用在于:

  • 定义一组规范:抽象类中的抽象方法可以定义一组规范,让所有子类必须实现这些方法,这样就能确保子类有相同的行为,而不同的实现。
  • 共享代码:抽象类中的非抽象方法可以被多个子类继承和重用,这样能避免重复代码的产生。
  • 限制继承:抽象类不能被实例化,只能被继承,这样可以确保子类必须实现抽象方法,从而保证了一定的程序可靠性。

下面是一个抽象类的例子:

abstract class Shape {
    // 非抽象方法
    public void draw() {
        System.out.println("Drawing...");
    }

    // 抽象方法
    public abstract double area();
}

在上面的例子中,Shape类是一个抽象类,它包含一个非抽象方法draw()和一个抽象方法area()。子类必须实现area()方法,但可以继承并重用draw()方法。

抽象类与接口类似,但它们有一些区别。接口只包含抽象方法和常量,而抽象类可以包含非抽象方法和成员变量。接口可以被多重继承,而抽象类只能被单一继承。如果要在一个类中定义行为的一部分,使用抽象类,如果要定义某个类需要遵循的协议,使用接口。

总结对比

以下内容是对接口和抽象类的对比:

  1. 抽象类中可以定义构造方法;接口中不能定义构造方法。
  2. 抽象类中可以定义抽象方法和具体方法;接口中可以定义抽象方法不能定义具体方法。
  3. 抽象类中的成员可以是private、默认、protected、public修饰的;早期版本的接口中的成员只能用public修饰,Java8支持接口default方法。
  4. 抽象类中可定义成员变量;接口中不能定义成员变量,定义的“成员变量”默认会添加public static final
  5. 包含抽象方法的类型应该声明成抽象类或接口,但抽象类和接口都不必包含抽象方法。
  6. 抽象类中可以包含静态方法;早期版本的接口中不能有静态方法,Java8支持接口静态方法。
  7. 一个类最多只能继承自一个抽象类;一个类最多可以实现多个接口。

总的来说,接口强调的是对行为的抽象,而抽象类强调的是对类的抽象。接口是定义了一组抽象的方法,表示实现该接口的类具有某些行为。而抽象类则是定义了一种类,该类不能被直接实例化,必须由其子类来实现其抽象方法,从而达到对类的抽象。