Java中抽象类和接口的区别,一文弄懂,图文并茂

简介: Java中抽象类和接口的区别,一文弄懂,图文并茂

目录

前言

1. 抽象类

1.1 定义

1.2 示例

1.3 使用

1.3.1代码-抽象类

1.3.2代码-抽象类继承类使用
1.3.3输出结果为:

1.4UML类图展示类间的关系

2. 接口

2.1 定义

2.2 示例

2.2.1代码-接口

2.3 使用

2.3.1代码-接口实现

2.3.2代码-接口实现类使用

2.3.3输出结果为:

2.4UML类图展示类间的关系

3. 抽象类和接口的区别

3.1 实现方式

3.2 方法类型

3.3 成员变量

3.4 构造方法

3.5 访问修饰符

4.文字上的对比区别

5.直观的二维表对比

6.抽象类和接口的使用场景

7. 总结

前言

Java是一种面向对象的编程语言,Java中的抽象类和接口是两种常见的抽象概念,它们都能够帮助我们实现抽象化和多态性,但是它们在一些细节上有所不同。本文将详细介绍Java中抽象类和接口的定义、区别和使用,并提供相应的代码示例。

1. 抽象类

1.1 定义

抽象类是一种特殊的类,它不能被实例化,只能被继承。抽象类具有类的所有特性,包括成员变量、成员方法、构造方法等,但是其中的某些方法是抽象的,需要在具体的子类中实现。抽象方法没有方法体,只有方法签名,用abstract关键字修饰。抽象类通常被用来作为其他类的基类,子类必须实现抽象类中定义的所有抽象方法才能被实例化。

抽象类可以包含一些具体的方法和成员变量,这些方法和成员变量在继承的子类中可以直接使用。

1.2 示例

1.2.1代码-抽象类

以下是一个抽象类的示例:

abstract class Animal {
    private String name;
    public Animal(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public abstract void makeSound();
}

在上述代码中,Animal是一个抽象类,其中有一个抽象方法makeSound(),需要在具体的子类中实现。同时,Animal类中还有一个构造方法和两个普通方法。


1.3 使用

1.3.1代码-抽象类

我们可以通过继承抽象类来实现具体的子类,同时需要实现其中的抽象方法。以下是一个继承Animal类的示例:

class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }
    @Override
    public void makeSound() {
        System.out.println("汪汪汪");
    }
}

在上述代码中,Dog类继承了Animal类,同时实现了其中的抽象方法makeSound()。我们可以通过创建Dog类的实例来使用它。

1.3.2代码-抽象类继承类使用

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("小狗");
        System.out.println(dog.getName());
        dog.makeSound();
    }
}

1.3.3输出结果为:

小狗

汪汪汪

1.4UML类图展示类间的关系

2. 接口

2.1 定义

接口是一种纯抽象的类型,它只包含抽象方法和常量。接口通常被用来描述一个对象可以做什么,而不是它是什么,准确的来说描述的对象的行为

接口不能被实例化,需要通过实现接口的类来使用。接口中的方法都是抽象的,用abstract关键字修饰。接口中的常量都是public static final类型的,可以直接通过接口名访问。

2.2 示例

以下是一个接口的示例:

2.2.1代码-接口

interface Shape {
    double PI = 3.1415926;
    double getArea();
    double getPerimeter();
}

在上述代码中,Shape是一个接口,其中有两个抽象方法getArea()和getPerimeter(),还有一个常量PI。

2.3 使用

我们可以通过实现接口来使用它。以下是一个实现Shape接口的示例:

2.3.1代码-接口实现

class Circle implements Shape {
    private double radius;
    public Circle(double radius) {
        this.radius = radius;
    }
    @Override
    public double getArea() {
        return PI * radius * radius;
    }
    @Override
    public double getPerimeter() {
        return 2 * PI * radius;
    }
}

在上述代码中,Circle类实现了Shape接口,并实现了其中的两个抽象方法getArea()和getPerimeter()。我们可以通过创建Circle类的实例来使用它。

2.3.2代码-接口实现类使用

public class Main {
    public static void main(String[] args) {
        Circle circle = new Circle(2);
        System.out.println("面积:" + circle.getArea());
        System.out.println("周长:" + circle.getPerimeter());
    }
}

2.3.3输出结果为:

面积:12.5663704

周长:12.5663704

2.4UML类图展示类间的关系

3. 抽象类和接口的区别

虽然抽象类和接口都可以实现抽象化和多态性,但是它们在一些细节上有所不同。以下是抽象类和接口的区别:

3.1 实现方式

抽象类是一种特殊的类,需要通过继承它来使用。接口是一种纯抽象的类型,需要通过实现它来使用。

3.2 方法类型

抽象类中的方法可以是抽象的或者非抽象的,而接口中的方法都是抽象的。

3.3 成员变量

抽象类中可以有普通成员变量,也可以有静态成员变量,而接口中只能有常量。

3.4 构造方法

抽象类中可以有构造方法,而接口中不能有构造方法。

3.5 访问修饰符

抽象类中的成员变量和成员方法可以有public、protected、default、private四种访问修饰符,而接口中的成员变量和成员方法只能有public访问修饰符。

4.文字上的对比区别

(1)抽象类可以包含具体的方法和成员变量,而接口不能包含具体的方法和成员变量。

(2)一个类只能继承一个抽象类,而一个类可以实现多个接口。
(3)抽象类的目的是为了作为其他类的基类,而接口的目的是为了描述一个对象可以做什么。


(4)抽象类中的抽象方法必须在子类中实现,而接口中的所有方法都必须在实现类中实现。


(5)抽象类可以有构造方法,而接口不能有构造方法。


(6)抽象类可以拥有非抽象方法,而接口只能拥有抽象方法。


(7)抽象类中的访问修饰符可以是public、protected和default,而接口中的访问修饰符只能是public。


(8)抽象类可以拥有静态方法和静态变量,而接口只能拥有常量。

5.直观的二维表对比

维度 抽象类 接口
定义 一种特殊的类,不能被实例化 定义一组方法
方法 可以包含普通方法和抽象方法 只能包含抽象方法
维度 抽象类 接口
定义 一种特殊的类,不能被实例化 定义一组方法
方法 可以包含普通方法和抽象方法 只能包含抽象方法
构造器 可以有构造器 没有构造器
继承 可以被继承 可以被实现
多继承 不支持多重继承 支持多重实现
访问 可以有 public、protected、private 访问修饰符 只能有 public 访问修饰符
变量 可以有实例变量、类变量 只能有 public、static 常量

6.抽象类和接口的使用场景

抽象类和接口都有自己的使用场景,下面我们来看一下它们的具体应用:(1)抽象类通常被用来作为其他类的基类,用来定义一组通用的方法和属性。子类必须实现抽象类中的所有抽象方法才能被实例化。


(2)接口通常被用来描述一个对象可以做什么,而不是它是什么。接口可以被类实现,用来强制实现一组特定的方法。


(3)如果一个类需要实现多个不同的蓝图,那么它应该实现多个接口。


(4)如果一个类需要实现一个通用的蓝图,并且还需要拥有一些具体的方法和属性,那么它应该继承一个抽象类。

7. 总结

本文详细介绍了Java中抽象类和接口的定义、区别和使用,并提供了相应的代码示例。抽象类和接口都是实现抽象化和多态性的重要手段,需要根据实际需求选择使用。同时,需要注意它们在一些细节上的差异,以便正确使用它们。

相关文章
|
6天前
|
安全 Java
【JAVA】在 Queue 中 poll()和 remove()有什么区别
【JAVA】在 Queue 中 poll()和 remove()有什么区别
|
6天前
|
Java API
【JAVA】final、finally、finalize 有什么区别?
【JAVA】final、finally、finalize 有什么区别?
|
6天前
|
Java
【JAVA】throw 和 throws 的区别?
【JAVA】throw 和 throws 的区别?
|
2天前
|
存储 Java
java IO接口(Input)用法
【5月更文挑战第1天】Java的`java.io`包包含多种输入输出类。此示例展示了如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着创建一个字节数组存储读取的数据,调用`read()`方法将文件内容填充至数组。然后将字节数组转换为字符串并打印,最后关闭输入流。注意,`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
12 2
|
2天前
|
NoSQL Java API
java一行代码实现RESTFul接口
Spring Data REST是构建在Spring Data之上的库,可自动将repository转换为REST服务,支持JPA、MongoDB、Neo4j、GemFire和Cassandra。无需手动创建Service和Controller层。要开始,需配置JPA数据源,创建实体类和Repository接口。快速实现REST接口,只需引入spring-boot-starter-data-rest Maven依赖,并在Repository接口上添加@RepositoryRestResource注解。
|
3天前
|
Java
Java中 a+=b和a=a+b有什么区别?
Java中 a+=b和a=a+b有什么区别?
|
3天前
|
Java 开发者
Java中三种Set的实现类的用法和区别
Java中三种Set的实现类的用法和区别
|
4天前
|
Java 程序员 数据格式
关于Java抽象类和接口的总结和一点个人的看法
关于Java抽象类和接口的总结和一点个人的看法
|
6天前
|
存储 安全 Java
【JAVA】concurrentHashMap和HashTable有什么区别
【JAVA】concurrentHashMap和HashTable有什么区别
|
6天前
|
安全 Java
【JAVA】线程的run()和start()有什么区别?
【JAVA】线程的run()和start()有什么区别?