接口和抽象类的区别

语法层面

定义方式
  • 抽象类:使用 abstract 关键字修饰类。例如:
abstract class Animal {
    // 抽象方法
    public abstract void makeSound();
    // 普通方法
    public void eat() {
        System.out.println("Animal is eating");
    }
}
  • 接口:使用 interface 关键字定义。例如:
interface Flyable {
    // 抽象方法,默认是 public abstract 修饰
    void fly();
    // Java 8 开始支持默认方法
    default void land() {
        System.out.println("Flying object is landing");
    }
}
成员变量
  • 抽象类:可以有各种类型的成员变量,包括静态变量、实例变量,并且可以使用不同的访问修饰符(privateprotectedpublic)。例如:
abstract class Vehicle {
    private int wheels;
    protected String color;
    public static final int MAX_SPEED = 200;

    public Vehicle(int wheels, String color) {
        this.wheels = wheels;
        this.color = color;
    }
}
  • 接口:成员变量默认是 public static final 类型,即常量,必须在定义时进行初始化。例如:
interface Shape {
    double PI = 3.14;
}
方法
  • 抽象类:可以包含抽象方法(使用 abstract 关键字修饰,只有方法声明,没有方法体)和普通方法(有方法体)。例如:
abstract class Bird {
    public abstract void fly();
    public void sleep() {
        System.out.println("Bird is sleeping");
    }
}
  • 接口:在 Java 8 之前,接口中的方法都是抽象方法,不能有方法体。从 Java 8 开始,接口支持默认方法(使用 default 关键字修饰)和静态方法,Java 9 开始支持私有方法。例如:
interface Swimmable {
    void swim();
    default void dive() {
        System.out.println("Swimming object is diving");
    }
    static void showInfo() {
        System.out.println("This is a swimmable object");
    }
}
继承和实现
  • 抽象类:一个类只能继承一个抽象类,使用 extends 关键字。例如:
class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Woof!");
    }
}
  • 接口:一个类可以实现多个接口,使用 implements 关键字。例如:
class FlyingFish implements Flyable, Swimmable {
    @Override
    public void fly() {
        System.out.println("Flying fish is flying");
    }

    @Override
    public void swim() {
        System.out.println("Flying fish is swimming");
    }
}

设计层面

抽象程度
  • 抽象类:抽象类是对一类事物的抽象,它描述了一组具有相似特征和行为的对象。例如,Animal 抽象类可以表示所有动物的共性,子类可以继承这些共性并进行扩展。
  • 接口:接口是对行为的抽象,它定义了一组行为规范,而不关心具体的实现细节。例如,Flyable 接口定义了飞行的行为,任何实现该接口的类都需要实现飞行的方法。
使用场景
  • 抽象类:当需要定义一组具有共同属性和行为的对象,并且这些对象有一些默认的实现时,使用抽象类。例如,在一个图形绘制系统中,可以定义一个抽象类 Shape,包含一些通用的属性(如颜色、位置)和方法(如绘制),具体的图形类(如圆形、矩形)可以继承该抽象类并实现特定的绘制方法。
  • 接口:当需要为不同的类提供统一的行为规范,或者需要实现多继承的效果时,使用接口。例如,在一个电商系统中,商品类可以实现 Sellable 接口,订单类可以实现 Payable 接口,不同的类可以根据自己的需求实现不同的接口。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值