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

相关文章
|
7天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
8天前
|
Java
java线程接口
Thread的构造方法创建对象的时候传入了Runnable接口的对象 ,Runnable接口对象重写run方法相当于指定线程任务,创建线程的时候绑定了该线程对象要干的任务。 Runnable的对象称之为:线程任务对象 不是线程对象 必须要交给Thread线程对象。 通过Thread的构造方法, 就可以把任务对象Runnable,绑定到Thread对象中, 将来执行start方法,就会自动执行Runable实现类对象中的run里面的内容。
23 1
|
13天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
41 4
|
20天前
|
安全 Java
在 Java 中使用实现 Runnable 接口的方式创建线程
【10月更文挑战第22天】通过以上内容的介绍,相信你已经对在 Java 中如何使用实现 Runnable 接口的方式创建线程有了更深入的了解。在实际应用中,需要根据具体的需求和场景,合理选择线程创建方式,并注意线程安全、同步、通信等相关问题,以确保程序的正确性和稳定性。
|
15天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
18天前
|
Java
Java基础(13)抽象类、接口
本文介绍了Java面向对象编程中的抽象类和接口两个核心概念。抽象类不能被实例化,通常用于定义子类的通用方法和属性;接口则是完全抽象的类,允许声明一组方法但不实现它们。文章通过代码示例详细解析了抽象类和接口的定义及实现,并讨论了它们的区别和使用场景。
|
18天前
|
Java 测试技术 API
Java零基础-接口详解
【10月更文挑战第19天】Java零基础教学篇,手把手实践教学!
18 1
|
20天前
|
Java 测试技术 开发者
Java零基础-抽象类详解
【10月更文挑战第17天】Java零基础教学篇,手把手实践教学!
17 2
|
22天前
|
Java 测试技术 开发者
Java零基础-抽象类详解
【10月更文挑战第15天】Java零基础教学篇,手把手实践教学!
19 2
|
23天前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。