”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 理解 Java 中的 OOP:就像学习开车一样

理解 Java 中的 OOP:就像学习开车一样

发布于2024-11-02
浏览:768

Understanding OOP in Java: Like Learning to Drive a Car

如果您曾经听说过术语 OOP(面向对象编程)并认为它听起来像是科幻电影中的东西,那么您我并不孤单。但别担心,事情没那么复杂。 ?想象一下学习驾驶汽车。一旦你了解了基础知识,它就会成为你的第二天性。好吧,OOP 就是这样,但是对于编程来说。

在这篇博客中,我们将分解OOP的四大支柱,并使用现实生活中的例子来解释它们。系好安全带,因为这将是一次平稳的旅程! ??


1.封装:保证您的秘密安全?

定义:封装就像在你的车里有一个只有你知道的秘密隔间。您可以控制谁有权访问它。用技术术语来说,它是关于隐藏对象的内部状态并只允许通过公共接口(方法)进行访问。

现实生活示例:想象一下您正在驾驶一辆车。你不需要知道引擎是如何工作的;您只需踩下油门踏板,汽车就会开动!引擎对你来说是隐藏的(谢天谢地)。类似地,在 Java 中,封装隐藏了对象的内部工作原理。您可以使用对象的公共方法与对象交互,而不必担心混乱的内部细节。

代码示例

class Car {
    // Private variables - hidden from outside
    private String engineStatus = "off";

    // Public method to control the engine
    public void startEngine() {
        engineStatus = "on";
        System.out.println("The car engine is now "   engineStatus);
    }

    // Public method to check the engine status
    public String getEngineStatus() {
        return engineStatus;
    }
}

public class Main {
    public static void main(String[] args) {
        Car myCar = new Car();
        myCar.startEngine(); // You can't directly access the engine, but you can use the public methods
        System.out.println("Engine status: "   myCar.getEngineStatus());
    }
}

简而言之:封装是为了保护您的引擎免受好奇之手的伤害,同时让您在驾驶时无需过度思考机械原理。


2.传承:家族特质传承下来?‍?‍?

定义:继承就像是代代相传的家庭食谱。当你继承某些东西时,你不必从头开始创建它,你只需得到它即可。在Java中,一个类可以继承另一个类的字段和方法。

现实生活中的例子:假设你的父亲是一位伟大的机械师。你继承了这些技能。现在您无需从头学习所有内容即可修理汽车。在Java中,子类(子类)可以从其父类(超类)继承字段和方法。

代码示例

// Parent class
class Vehicle {
    public void honk() {
        System.out.println("Beep beep!");
    }
}

// Child class inherits Vehicle
class Car extends Vehicle {
    public void drive() {
        System.out.println("Driving a car!");
    }
}

public class Main {
    public static void main(String[] args) {
        Car myCar = new Car();
        myCar.honk();  // Inherited from Vehicle class
        myCar.drive(); // Car-specific method
    }
}

简而言之:继承可以让你重用现有的代码,就像继承好的基因一样。就像你继承了你父亲的机械技能一样,Car 类继承了 Vehicle 鸣喇叭的能力。


3.多态性:成为多种事物的力量?‍♂️

定义:多态就像一个可以变形的超级英雄。一会儿,他们在飞翔;一会儿,他们在飞翔。接下来,他们从眼睛发射激光。它允许物体根据情况采取多种形式。

现实生活中的例子:想想一个司机。当你开车时,无论是法拉利还是本田思域,你都会踩油门加速。相同的动作(踩踏板)适用于两辆车,但结果可能会有所不同(一辆比另一辆快得多??)。

代码示例

// Parent class
class Animal {
    public void sound() {
        System.out.println("Some generic animal sound");
    }
}

// Child class - specific to Dog
class Dog extends Animal {
    public void sound() {
        System.out.println("Woof woof!");
    }
}

// Child class - specific to Cat
class Cat extends Animal {
    public void sound() {
        System.out.println("Meow!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog(); // Dog is an Animal
        Animal myCat = new Cat(); // Cat is an Animal

        myDog.sound(); // Outputs: Woof woof!
        myCat.sound(); // Outputs: Meow!
    }
}

简而言之:多态性允许你像对待动物一样对待狗,但是当你要求它发出声音时,它知道要吠叫。根据对象的不同,相同的操作可能会导致不同的行为。很酷吧?


4.抽象:保持简单的艺术?

定义:抽象就像复杂事物的简化视图。当您使用智能手机时,您不需要知道它的内部工作原理,您只需要知道如何使用应用程序即可。在编程中,抽象意味着仅显示必要的细节,同时隐藏复杂性。

现实生活示例:当您驾驶汽车时,您会与方向盘、踏板和按钮进行交互。您并不关心内燃机是如何工作的(谢天谢地!)。同样,在 Java 中,抽象隐藏了复杂的细节,只公开了基本的功能。

代码示例

// Abstract class
abstract class Car {
    // Abstract method (no implementation)
    abstract void start();

    // Concrete method (with implementation)
    public void stop() {
        System.out.println("The car is stopped.");
    }
}

// Subclass provides implementation for the abstract method
class Tesla extends Car {
    public void start() {
        System.out.println("Tesla starting with a silent hum...");
    }
}

public class Main {
    public static void main(String[] args) {
        Car myTesla = new Tesla();
        myTesla.start();  // Calls the abstract method's implementation in Tesla
        myTesla.stop();   // Calls the concrete method in Car
    }
}

简而言之:抽象可以帮助您专注于重要的事情,而不必担心不需要的细节。


总结:OOP 是更好代码的路线图

就像一旦您了解了基础知识,驾驶就会成为第二天性一样,一旦您了解了 OOP 的核心原则,就会感觉轻而易举:

  • 封装使您的代码保持干净和有组织,隐藏不必要的细节。
  • 继承让您可以像家庭食谱一样重用代码。
  • 多态性使您可以灵活地处理同一概念的不同形式。
  • 抽象将复杂的现实简化为可理解的行动。

一旦掌握了这些,您将像专业人士一样编码,就像了解每个齿轮的汽车爱好者一样,您将掌握代码的每一个部分。 ??


P.S.如果您仍在学习,请记住每个人都曾经是新手。继续编码,很快,您将在面向对象编程的高速公路上巡航,头发随风飘扬! ?

版本声明 本文转载于:https://dev.to/akshay_gengaje/understanding-oop-in-java-like-learning-to-drive-a-car-29bo?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • IntTo Float64 JSON转换之谜
    IntTo Float64 JSON转换之谜
    使用 JSON 听起来简单明了,你有一些结构,你可以将其更改为 JSON - 一种通用的统一语言并返回到你的结构。简单吧? ? 嗯,是的,但是直到您遇到 Marshal / Unmarshal 函数的一些奇怪行为。 问题 ? 这一切都是从我尝试从 JWT 令牌读取编码的有效负载时开始...
    编程 发布于2024-11-02
  • 如何从 Ubuntu 12.04 中彻底删除 MySQL 5.7?
    如何从 Ubuntu 12.04 中彻底删除 MySQL 5.7?
    删除 MySQL 5.7:清除和卸载综合指南要从 Ubuntu 12.04 系统中完全删除 MySQL 5.7,请按照以下综合步骤操作:备份数据库在继续卸载之前,请确保您已使用 mysqldump 实用程序备份了基本数据库。仅备份所需的数据库,因为完整数据库备份可能是卸载问题的根本原因。停止 MyS...
    编程 发布于2024-11-02
  • 如何在没有 CLI 访问的情况下清除共享托管服务器上的 Laravel 5 缓存?
    如何在没有 CLI 访问的情况下清除共享托管服务器上的 Laravel 5 缓存?
    在 Laravel 5 中清除共享托管服务器上的缓存在 Laravel 5 中,您可以使用 cache:clear Artisan 命令有效地清除缓存。但是,在共享托管服务器上工作时,您可能无权访问 CLI。这就提出了一个问题:我可以在缺乏控制面板访问权限的共享托管服务器上不使用 CLI 来清除缓存...
    编程 发布于2024-11-02
  • Websocket 或 Socket io!让我们来看看吧!
    Websocket 或 Socket io!让我们来看看吧!
    WebSockets 与 Socket.IO:实时对决 当谈到网络上的实时通信时,开发人员经常发现自己陷入两个选择之间:WebSockets 和 Socket.IO。这两种工具都擅长它们的工作——提供了一种在客户端和服务器之间实现双向通信的方法——但每种工具都有自己独特的个性。这有...
    编程 发布于2024-11-02
  • Deno 起飞
    Deno 起飞
    网络是人类最大的软件平台,拥有超过 50 亿用户,并且还在不断增长。然而,随着 Web 开发需求的飙升,其复杂性也随之增加。在无尽的配置文件、大量的样板文件和大量的依赖项之间,开发人员花费更多的时间来进行设置,而不是构建下一个大东西。? 进入 Deno,这是一种用于 JavaScript 和 Typ...
    编程 发布于2024-11-02
  • 使用 Django Rest Framework 寻找海森堡
    使用 Django Rest Framework 寻找海森堡
    The idea The idea was to create a simple platform for DEA agents, to manage information about characters from the Breaking Bad/Better Call Sa...
    编程 发布于2024-11-02
  • 汤姆和杰瑞灯代码
    汤姆和杰瑞灯代码
    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ...
    编程 发布于2024-11-02
  • 通过实践学习 TDD:在 Umbraco 的富文本编辑器中标记成员
    通过实践学习 TDD:在 Umbraco 的富文本编辑器中标记成员
    在我正在构建的系统中,我需要能够在网站的文本中提及 Umbraco 成员。为此,我需要构建 Umbraco 富文本编辑器的扩展:TinyMCE。 语境 作为内容编辑者,我想在消息或文章中标记成员,以便他们收到有关其新内容的通知。 我研究了类似的实现,例如 Slack 或 X 上的实现...
    编程 发布于2024-11-02
  • 如何在Python测试场景中模拟HTTP请求和响应?
    如何在Python测试场景中模拟HTTP请求和响应?
    Python 测试的模拟请求和响应在 Python 测试中,有必要模拟模块及其功能来控制执行流程并验证具体场景。其中,模拟 requests 模块通常用于测试依赖于 HTTP 请求的函数或方法。考虑一个包含以下代码的views.py 文件:def myview(request): res1 ...
    编程 发布于2024-11-02
  • 如何构建适用于 Windows、Linux 和 macOS 的 Python 条码扫描器
    如何构建适用于 Windows、Linux 和 macOS 的 Python 条码扫描器
    条形码扫描已成为从零售、物流到医疗保健等各个行业的重要工具。在桌面平台上,它可以快速捕获和处理信息,无需手动输入数据,从而节省时间并减少错误。在本教程中,我们将通过构建适用于 Windows、Linux 的 Python 条形码扫描仪 继续探索 Dynamsoft Capture Vision SD...
    编程 发布于2024-11-02
  • ## 如何在 Python 中创建不可变对象以及为什么 nametuple 是最好的方法?
    ## 如何在 Python 中创建不可变对象以及为什么 nametuple 是最好的方法?
    Python 中的不可变对象在 Python 中,不变性为保护数据完整性提供了一种有价值的机制。然而,创建不可变对象会带来一定的挑战。重写 setattr常见的方法是重写 setattr方法。然而,即使在 init 过程中也会调用此方法,因此它不适合创建不可变对象。子类化 Tuple另一种策略涉及对...
    编程 发布于2024-11-02
  • 最常被问到的 React 面试问题
    最常被问到的 React 面试问题
    如何优化 React 应用程序的性能? 1。组件应谨慎更新 实现 shouldComponentUpdate 或 React.memo 通过比较 props 或 states 来防止不必要的重新渲染。 2.使用功能组件和钩子 带钩子的功能组件通常比类组件性能更高。 3.延迟加载组件...
    编程 发布于2024-11-02
  • (Wordpress 初学者):仅将子域从托管转移(迁移)到另一个新托管。
    (Wordpress 初学者):仅将子域从托管转移(迁移)到另一个新托管。
    我只想从 Bluehost 托管转移(迁移)一个新托管(例如 Fastcomet 或 Chemicloud)的子域。 我想知道我迁移子域的步骤是否正确以及我应该做什么更改 DNS 内容...... ** 我的情况1:** – 主 Web 域(例如:forcleanworld.com)保留在 Blue...
    编程 发布于2024-11-02
  • 使用 Java 进行数据分析:信息处理初学者指南
    使用 Java 进行数据分析:信息处理初学者指南
    Java 是一种适用于数据分析的强大语言,它提供用于处理大型数据集和执行复杂分析的基础结构,包括:数据结构:用于存储和组织数据的集合,例如数组和列表。IO 流:用于读取和写入文件的对象。Java 集合框架:用于管理和操作数据结构的强大集合类库。使用 Java 进行数据分析的实际案例包括分析文本文件,...
    编程 发布于2024-11-02
  • 雇用自由 Python 开发人员时要避免的常见错误
    雇用自由 Python 开发人员时要避免的常见错误
    介绍 雇用合适的自由 Python 开发人员可以决定你的项目的成败。然而,许多企业在招聘过程中会犯一些常见的错误,这些错误可能会导致招聘延迟、成本超支和结果不佳。以下是如何避免这些陷阱并确保项目成功的方法。 没有明确定义项目要求 最常见的错误之一是在开始招聘流程之前...
    编程 发布于2024-11-02

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3