Java 基础——抽象类与接口

本文介绍了Java中的抽象类和接口的区别与应用场景。抽象类不能被实例化,常用于代码复用和强制实现某些方法。接口则提供了方法契约,允许类实现多个接口,Java8后接口也可有默认方法。在设计时,抽象类更适合IS-A关系,接口适合LIKE-A关系。选择使用抽象类或接口取决于代码组织和多继承需求。
摘要由CSDN通过智能技术生成

抽象类

抽象类和抽象方法都使用 abstract 关键字进行声明。抽象类一般会包含抽象方法,抽象方法一定位于抽象类中。

抽象类和普通类最大的区别是,抽象类不能被实例化,需要继承抽象类才能实例化其子类。

如下是一个抽象类:

package com.example.testdemo.demo;

public abstract class AbstactClass {
    abstract void run();
    abstract void play();
}

它的实现类是如下这样:

package com.example.testdemo.demo;

public class AbstactClassImpl extends AbstactClass{
    @Override
    void run() {

    }

    @Override
    void play() {

    }
}

如果进行实例化,则会报错:

 

接口

接口是抽象类的延伸,在 Java 8 之前,它可以看成是一个完全抽象的类,也就是说它不能有任何的方法实现。

从 Java 8 开始,接口也可以拥有默认的方法实现,这是因为不支持默认方法的接口的维护成本太高了。在 Java 8 之前,如果一个接口想要添加新的方法,那么要修改所有实现了该接口的类。

接口的成员(字段 + 方法)默认都是 public 的,并且不允许定义为 private 或者 protected。

接口的字段默认都是 static 和 final 的。

如下定义了一个接口:

package com.example.testdemo.demo;

public interface InterfaceClass {
    int age = 10;

    static int tall = 180;
    final int weight = 150;

    static void start() {
    }
    
    void end();

}

如下是一个接口的实现类:

package com.example.testdemo.demo;

public class InterfaceClassImpl implements InterfaceClass{
    @Override
    public void end() {

    }
}

 

比较

  • 从设计层面上看,抽象类提供了一种 IS-A 关系,那么就必须满足里式替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种 LIKE-A 关系,它只是提供一种方法实现契约,并不要求接口和实现接口的类具有 IS-A 关系。
  • 从使用上来看,一个类可以实现多个接口,但是不能继承多个抽象类。
  • 接口的字段只能是 static 和 final 类型的,而抽象类的字段没有这种限制。
  • 接口的成员只能是 public 的,而抽象类的成员可以有多种访问权限。

 

使用选择

使用接口:

  • 需要让不相关的类都实现一个方法,例如不相关的类都可以实现 Compareable 接口中的 compareTo() 方法;
  • 需要使用多重继承。

使用抽象类:

  • 需要在几个相关的类中共享代码。
  • 需要能控制继承来的成员的访问权限,而不是都为 public。
  • 需要继承非静态和非常量字段。

在很多情况下,接口优先于抽象类,因为接口没有抽象类严格的类层次结构要求,可以灵活地为一个类添加行为。并且从 Java 8 开始,接口也可以有默认的方法实现,使得修改接口的成本也变的很低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值