一文带你读懂Java中的“抽象“,让“抽象”不再抽象(学习java必读)

编程世界里充满了各种神奇的概念,而有些概念初看起来可能让人觉得有些抽象🤔,其中之一就是“抽象”本身!对于刚接触Java编程的小伙伴来说,抽象可能会让你觉得有点难以捉摸😅,但其实,它是一个非常实用的技巧,能够帮助我们简化复杂的代码。

你有没有遇到过使用像ArrayList这样的类时,只需要关心如何添加、删除元素,而完全不需要了解它是如何在内部存储这些数据的?这就是抽象的魔力✨!抽象通过隐藏实现细节,只暴露出我们需要用到的最关键的信息。掌握抽象,能够让你的代码更加简洁、高效,提升你的编程水平💡。

在这篇文章中,我将带你深入理解抽象这一概念,帮助你通过抽象类接口在Java中实现它,轻松应对各种编程挑战👨‍💻。你会发现,抽象不仅仅是一个理论概念,它在实际开发中能帮助你写出更加清晰和可维护的代码!

如果你觉得这篇文章对你有帮助,别忘了点个赞👍,收藏起来🔖,并关注我的博客,和我一起探索更多Java编程的奥秘!加油,我们一起进步💪!

一.什么是抽象

抽象这个概念看起来真的挺抽象的,尤其是对于刚接触编程的同学。

抽象就是只展示那些最重要、最需要的信息,把其他不太重要的、实现的细节隐藏起来。它是面向对象编程(OOP)中,除了封装、继承和多态之外的一个关键概念。抽象让我们关注和处理对当前任务最相关的信息,而不用关心其他复杂的细节。

例如:

ArrayList 按顺序存储对象作为列表,您可以使用 add() 方法向 ArrayList 添加元素,使用 remove() 方法从其中移除元素,使用 get() 方法从 ArrayList 获取元素。这些就是您使用 ArrayList 所需要知道的内容。这就是 Java 中的抽象。

如果您想使用 ArrayList,您无需了解 ArrayList 是如何在内部工作的。

ArrayList 通过实现 List 接口来实现抽象,List 接口提供了使用 ArrayList 所需的所有方法。

所以,您可以按以下方式声明 ArrayList:

// 声明一个 List 类型的变量,实际使用的是 ArrayList 类
List<String> list = new ArrayList<>();

// 使用 add() 方法向 List 中添加元素
list.add("Java");
list.add("Python");
list.add("C++");

// 使用 remove() 方法移除元素
list.remove("Python");

// 使用 get() 方法获取指定索引的元素
String python = list.get(1);

并调用 List 接口的 add()remove()get() 方法。

假设您后来意识到,由于需要执行更多的添加和删除操作,而不是访问操作,您应该使用 LinkedList 而不是 ArrayList。您可以通过比较 ArrayList 与 LinkedList 之间的差异来理解它们的区别。

您只需要更改以下一行代码:

// 将 ArrayList 替换为 LinkedList
List<String> list = new LinkedList<>();


// 使用 add() 方法向 List 中添加元素
list.add("Java");
list.add("Python");
list.add("C++");

// 使用 remove() 方法移除元素
list.remove("Python");

// 使用 get() 方法获取指定索引的元素
String python = list.get(1);

ArrayList 和 LinkedList 通过实现 List 接口来实现抽象。这就是为什么我们可以在上面的例子中将 ArrayList 替换为 LinkedList。

让我们再看一个现实生活中的例子

当您在 某度 上搜索任何文本时,您只需在文本框中输入文本并点击搜索按钮。您可能并不知道幕后发生了什么,搜索算法是如何工作的。

 

二. 实现抽象的方式

您可以通过两种方式在 Java 中实现抽象:

  1. 抽象类(0% 到 100% 的抽象)
  2. 接口(100% 的抽象)

2.1 Java 中的抽象类

抽象类是声明为抽象的类,可以包含抽象方法或非抽象方法。它应该被子类继承,并且子类必须实现抽象方法。

Java 中的抽象方法: 抽象方法是没有实现的方法,即它没有方法体

// 声明一个抽象类 Shape
abstract class Shape {
    // 抽象方法,计算面积,没有方法体
    public abstract double calculateArea();
}

2.2 Java 中的接口

接口通常用于提供类的实现合同。接口没有任何方法的实现。一个类实现了一个接口,从而继承了接口的抽象方法。因此,这就像签署一个合同,您同意如果实现该接口,就必须使用它的方法。

接口只是一个模式,它本身不能做任何事情。

// 定义一个接口 Paintable,要求实现该接口的类必须提供 paint 方法的实现
interface Paintable {
    void paint();  // 声明一个抽象方法 paint
}

// 创建一个类 Room,实现 Paintable 接口
public class Room implements Paintable {
    
    // 提供 paint 方法的实现
    @Override
    public void paint() {
        System.out.println("Painting the room");
    }
}


三. 抽象示例

假设我们有一个 Sport 接口。现在,接口的实现将由名为 CricketFootball 的类提供。在实际场景中,最终用户不会知道实现类,并且实现类的对象可以通过工厂方法提供。

工厂方法可以根据某些标准创建实现类的对象。

让我们创建一个名为 Sport.java 的接口:

// 定义 Sport 接口,声明 play 方法
public interface Sport {
    void play();  // 声明一个抽象方法 play
}

创建一个名为 Cricket.java 的类:

// 实现 Sport 接口的 Cricket 类
public class Cricket implements Sport {
    
    // 提供 play 方法的实现
    @Override
    public void play() {
        System.out.println("Playing cricket");
    }
}

创建一个名为 Football.java 的类:

// 实现 Sport 接口的 Football 类
public class Football implements Sport {
    
    // 提供 play 方法的实现
    @Override
    public void play() {
        System.out.println("Playing football");
    }
}

创建一个主类 SportInterfaceMain.java

// 主类(即带有main方法的类),用于演示如何使用 Sport 接口
public class SportInterfaceMain {

    public static void main(String[] args) {

        // 在实际场景中,您将使用 getSport() 工厂方法获取具体的对象
        Sport sport = new Cricket();  // 创建 Cricket 对象
        sport.play();  // 调用 play 方法,输出:Playing cricket

        System.out.println("=================");

        // 您可以轻松地切换实现类
        sport = new Football();  // 创建 Football 对象
        sport.play();  // 调用 play 方法,输出:Playing football
    }
}

当您运行上述程序时,会得到如下输出:

Playing cricket
=================
Playing football

 

四. 抽象与封装的区别

封装是将相关的数据(变量和方法)绑定到一个类中的过程。我们可以使用访问修饰符(如 publicprivateprotected)来实现封装。

封装是所需抽象的实现。

抽象更多的是设计层次的概念,帮助您提供仅必要的细节,并隐藏实现细节。我们可以通过抽象类和接口来实现抽象。

看!抽象其实并没有那么神秘对吧?🤩 通过这篇文章,我们一起揭开了抽象的面纱,明白了它是如何通过抽象类和接口帮助我们简化复杂的实现,让编程变得更加灵活和高效。而且,你现在已经知道了如何在Java中巧妙地运用抽象,让你的代码既简洁又强大💪!

其实,抽象就像编程世界里的魔法师🧙‍♂️,它让你从复杂的细节中抽离出来,只关注最核心、最需要的信息。而你,作为一个开发者,正是这场魔法的施法者✨。只要掌握了抽象,你的编程技能就能进入一个新的层次!🔥

希望这篇文章能对你有所启发,帮助你在Java编程的道路上越走越远。如果你觉得这些内容有用,别忘了给我点个赞👍,收藏这篇文章🔖,或者关注我的博客📲,我们一起深入探索更多编程的有趣世界!下次见!👋😊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大名顶顶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值