莫度编程网

技术文章干货、编程学习教程与开发工具分享

JAVA面试|抽象类和接口的区别(抽象类和接口类的异同)

在Java中,抽象类(Abstract Class)和接口(Interface)都是实现多态和代码复用的重要机制,但它们在设计目的和使用场景上有明显区别。以下是通俗易懂的详细对比:

一、核心设计目的

抽象类:

描述"是什么"(IS-A关系)

例如:Dog(狗)是一种Animal(动物),Animal可以作为抽象类,定义动物共有的属性和行为。

接口:

描述"能做什么"(CAN-DO关系)

例如:Swimmable(可游泳)、Flyable(可飞行)是能力,不同的类(如Duck、Plane)可以实现这些能力。


二、关键区别对比

特性

抽象类 (Abstract Class)

接口 (Interface)

方法实现

可包含抽象方法 + 具体实现的方法

Java 8前:只有抽象方法;

Java 8+:支持default方法(有实现)、static方法

成员变量

可定义普通变量、常量、静态变量

只能是public static final常量(默认省略修饰符)

构造方法

有构造方法(用于初始化公共状态)

没有构造方法

继承关系

单继承(一个子类只能继承一个抽象类)

多实现(一个类可实现多个接口)

访问修饰符

方法可以是public、protected等

方法默认public(不可用protected/private)


三、代码示例

抽象类示例:

abstract class Animal {

private String name; // 普通成员变量


public Animal(String name) { // 构造方法

this.name = name;

}


public abstract void makeSound(); // 抽象方法(无实现)


public void eat() { // 具体实现的方法

System.out.println(name + " is eating.");

}

}


class Dog extends Animal {

public Dog(String name) {

super(name);

}


@Override

public void makeSound() { // 必须实现抽象方法

System.out.println("Woof!");

}

}

接口示例:

interface Swimmable {

void swim(); // 抽象方法(默认public abstract)


// Java 8+ 的默认方法(有实现)

default void dive() {

System.out.println("Diving into water...");

}

}


class Duck implements Swimmable {

@Override

public void swim() { // 必须实现抽象方法

System.out.println("Duck paddles in water.");

}

}


四、使用场景

用抽象类当:

多个类有共同属性和行为需要共享(如name属性和eat()方法)。

需要定义非public的受保护方法(如protected工具方法)。

需要构造方法初始化状态(如设置公共属性)。

用接口当:

定义跨类别的能力(如Swimmable可被鱼、船、机器人实现)。

需要多继承(一个类实现多个接口)。

作为API契约(如JDBC的Connection接口)。


五、通俗类比

假设你要设计游戏角色:

抽象类 = 基础角色模板

(如Character有血量、移动方法,但attack()是抽象的,需子类实现)。

接口 = 附加技能

(如FireAttack(火焰攻击)、Stealth(隐身),不同角色可自由组合技能)。


六、新特性(Java 8+)

接口的默认方法(default):

解决接口升级问题,避免破坏现有实现类。

interface Flyable {

void fly();

default void takeOff() { // 默认实现

System.out.println("Taking off...");

}

}

接口的静态方法:

提供工具方法(如Collections.sort())。

interface MathUtils {

static int add(int a, int b) {

return a + b;

}

}


七、总结

抽象类 = 父类模板("是什么" + 共享代码)

接口 = 能力合约("能做什么" + 自由组合)

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言

    Powered By Z-BlogPHP 1.7.4

    蜀ICP备2024111239号-43