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

相关文章
|
27天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
104 3
|
12天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
36 14
|
8天前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
14 1
|
18天前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
39 8
|
14天前
|
Java API
Java中内置的函数式接口
Java中内置的函数式接口
19 2
|
19天前
|
Java
在Java中如何实现接口?
实现接口是 Java 编程中的一个重要环节,它有助于提高代码的规范性、可扩展性和复用性。通过正确地实现接口,可以使代码更加灵活、易于维护和扩展。
42 3
|
18天前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
55 1
|
18天前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
35 1
|
18天前
|
Java
在Java中实现接口的具体代码示例
可以根据具体的需求,创建更多的类来实现这个接口,以满足不同形状的计算需求。希望这个示例对你理解在 Java 中如何实现接口有所帮助。
32 1
|
23天前
|
Java Android开发
Eclipse 创建 Java 接口
Eclipse 创建 Java 接口
25 1