面向对象是一种艺术

news2025/7/21 23:09:40

目录

  • 文章导读
  • 面向对象与面向过程
    • 是什么?
    • 两者的比较
  • 面向对象的三大特性
    • 封装
      • 怎么理解
      • 优点:
      • 代码示例
    • 继承
      • 怎么理解
      • 优点
      • 代码示例
    • 多态
      • 怎么理解
      • 优点
      • 示例代码
  • 总结

文章导读

本文不纠结语言的选择,仅仅介绍面向对象这一个编程思想的运用,以及与另一大主流的编程思想:面向过程的区别,我可以毫不夸张的说,面向对象这个词大家肯定都有所耳闻,但要真正理解它比找对象还要难!

面向对象与面向过程

是什么?

  • 面向对象思想是一种以对象为中心的编程方式,它将问题领域中的实体(事物、概念)抽象为对象,并通过定义对象的属性和行为来描述和操作这些实体。
    • 在面向对象思想中,对象是一个具体的实例,它具有特定的属性和行为。对象的属性表示对象的状态或特征,而对象的行为则表示对象可以执行的操作或方法。
    • 类是面向对象编程的一个核心概念,它是一种用来定义对象的模板或蓝图。类定义了一组共同的属性和行为,这些属性和行为会被类的实例(对象)所继承和应用。
    • 举个例子来说明,假设我们有一个类叫做"Person",它定义了人的属性(如姓名、年龄)和行为(如说话、行走)。通过这个类,我们可以创建多个Person对象,每个对象都有自己独立的姓名和年龄,并可以调用说话和行走方法。
  • 面向过程编程是一种基于过程或者操作的编程方式。它将问题视为一系列的步骤或操作,按照顺序依次执行这些操作。面向过程的程序主要由函数或者过程组成,通过调用这些函数来实现特定的功能。C语言就是典型的面向过程的语言。

两者的比较

  1. 面向对象思想是将问题领域中的实体抽象为对象,并通过定义类的属性和行为来描述和操作这些对象。类是对象的模板,而对象则是类的具体实例化结果。通过面向对象的编程,可以更好地模拟现实世界中的问题,提高代码的可读性、扩展性和复用性。

  2. 而面向过程编程更注重功能的实现和步骤的顺序,适用于解决特定的、相对简单的问题。两种范式各有优劣,选择使用哪种编程范式取决于具体的问题和需求。那就让我们举一个具体的例子:假设我们要编写一个程序来模拟汽车的行驶过程

    1. 面向对象的实现方式:

      1. 创建一个"汽车"类,该类具有属性(如品牌、颜色、速度)和行为(如加速、刹车)。
      2. 在程序中创建多个汽车对象,每个对象代表一辆具体的汽车,并具有各自的属性和行为。
      3. 使用对象之间的消息传递,调用汽车对象的方法来模拟加速和刹车的操作。
    2. 面向过程的实现方式:

      1. 定义函数来表示汽车的行为,如"加速"和"刹车",这些函数接收汽车的参数进行处理。
      2. 在程序中创建多个汽车变量,并通过传递参数调用函数来模拟汽车的加速和刹车操作。
    3. 对比两种实现方式:

      面向对象的实现方式更符合现实中的问题描述和设计,我们将汽车作为一个独立的对象来抽象,并通过定义类的属性和行为来描述汽车。多个具体的汽车对象可以同时存在,并且可以执行各自的行为,并且可以方便地扩展和修改汽车的属性和行为。

    总的来说面向对象的编程思维之所以为大多数程序员使用,还要得益于他的三大特性!以下所有代码均使用Java这个主流语言来举例。

面向对象的三大特性

封装

怎么理解

利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外的接口使其与外部发生联系。用户无需关心对象内部的细节,但可以通过对象对外提供的接口来访问该对象。

优点:

  • 减少耦合:可以独立地开发、测试、优化、使用、理解和修改
  • 减轻维护的负担:可以更容易被理解,并且在调试的时候可以不影响其他模块
  • 有效地调节性能:可以通过剖析来确定哪些模块影响了系统的性能
  • 提高软件的可重用性
  • 降低了构建大型系统的风险:即使整个系统不可用,但是这些独立的模块却有可能是可用的

代码示例

public class Person {

    private String name;
    private int gender;
    private int age;

    public String getName() {
        return name;
    }

    public String getGender() {
        return gender == 0 ? "man" : "woman";
    }

    public void work() {
        if (18 <= age && age <= 50) {
            System.out.println(name + " is working very hard!");
        } else {
            System.out.println(name + " can't work any more!");
        }
    }
}

Person 类封装 name、gender、age 等属性,外界只能通过get()方法获取一个 Person 对象的 name 属性和 gender 属性,而无法获取 age 属性,但是 age 属性可以供 work() 方法使用。

注意到 gender 属性使用int数据类型进行存储,封装使得用户注意不到这种实现细节。并且在需要修改 gender 属性使用的数据类型时,也可以在不影响客户端代码的情况下进行。

继承

在这里插入图片描述

怎么理解

继承是面向对象编程中的一个重要特性,它允许一个类(称为子类)从另一个类(称为父类或基类)继承属性和方法。通过继承,子类可以重用父类的代码,并在此基础上添加、修改或覆盖自己的特定行为。

继承实现了 IS-A 关系,例如 Cat 和 Animal 就是一种 IS-A 关系,因此 Cat 可以继承自 Animal,从而获得 Animal 非 private 的属性和方法。

继承应该遵循里氏替换原则,子类对象必须能够替换掉所有父类对象。

Cat 可以当做 Animal 来使用,也就是说可以使用 Animal 引用 Cat 对象。父类引用指向子类对象称为 向上转型

Animal animal = new Cat();

优点

  1. 代码重用:继承允许子类继承父类的属性和方法,子类不需要重新编写已经存在的代码,增加了代码的重用性。
  2. 扩展性:子类可以在父类的基础上扩展功能,添加自己特有的属性和方法,实现新的行为,从而满足特定需求。
  3. 维护性:通过继承,当基类需要修改时,只需要在基类中进行修改,所有的子类都会受到影响,减少了代码的维护成本。

代码示例

// 定义一个父类Animal
class Animal {
    protected String name;

    public Animal(String name) {
        this.name = name;
    }

    public void eat() {
        System.out.println(name + " is eating.");
    }
}

// 定义一个子类Dog,继承自Animal
class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }

    public void bark() {
        System.out.println(name + " is barking.");
    }
}

// 主函数
class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("Bobby");
        dog.eat();  // 调用从父类继承的eat()方法
        dog.bark(); // 调用子类自己的bark()方法
    }
}

在上述示例中,Animal类作为父类,有一个属性name和一个方法eat()。Dog类作为子类继承了Animal类,同时自己添加了一个方法bark()。在主函数中,我们创建了一个Dog对象,并调用了从父类继承的eat()方法和子类自己的bark()方法。通过继承,Dog类可以重用Animal类的代码,并扩展自己的行为。

多态

在这里插入图片描述

怎么理解

多态是面向对象编程中的一个重要概念,它允许使用不同的对象来调用相同的方法,实现了同一行为的多种表现形式。多态性提高了代码的灵活性、扩展性和可维护性。

多态分为编译时多态和运行时多态:

  • 编译时多态主要指方法的重载
  • 运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定

运行时多态有三个条件:

  • 继承
  • 覆盖(重写)
  • 向上转型

优点

  1. 灵活性:多态使得代码可以适应不同的对象类型,可以通过更改对象的类型来实现不同的行为,增加了代码的灵活性。
  2. 扩展性:通过多态,可以很容易地增加新的子类,而不用修改现有的代码,提供了代码的扩展性。
  3. 可维护性:多态降低了代码的耦合性,使得代码更易于维护和理解。

示例代码

public class Instrument {

    public void play() {
        System.out.println("Instument is playing...");
    }
}

public class Wind extends Instrument {

    public void play() {
        System.out.println("Wind is playing...");
    }
}



public class Percussion extends Instrument {

    public void play() {
        System.out.println("Percussion is playing...");
    }
}



public class Music {

    public static void main(String[] args) {
        List<Instrument> instruments = new ArrayList<>();
        instruments.add(new Wind());
        instruments.add(new Percussion());
        for(Instrument instrument : instruments) {
            instrument.play();
        }
    }
}

运行结果:
Wind is playing...
Percussion is playing...

代码中,乐器类(Instrument)有两个子类:Wind 和 Percussion,它们都覆盖了父类的 play() 方法,并且在 main() 方法中使用父类 Instrument 来引用 Wind 和 Percussion 对象。在 Instrument 引用调用 play() 方法时,会执行实际引用对象所在类的 play() 方法,而不是 Instrument 类的方法。

补充:

访问父类的构造函数:可以使用super()函数访问父类的构造函数,从而委托父类完成一些初始化的工作。应该注意到,子类一定会调用父类的构造函数来完成初始化工作,一般是调用父类的默认构造函数,如果子类需要调用父类其它函数,那么就可以使用 super关键字。

总结

本文详细地介绍了面向对象编程的基本概念和特性,以及类、对象、继承、封装和多态的具体定义和应用。通过这篇文章,读者可以深入了解面向对象编程的思想和方法,并能够运用它来解决实际问题。如果短时间内无法理解,真的没有关系,在写代码读优秀的代码的过程中慢慢理解这些概念,你一定会豁然开朗的!

至于一些高级的面向对象的知识,比如设计原则、设计模式、抽象类等,这些在我们真正编程的时候很少会用到,等到你成为一名真正意义上的架构师,再去系统学习也不迟,作者水平有限,这里就不涉及了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1102267.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL高级02-MySQL的数据目录

1.MySQL8的主要目录结构 查看MySQL的目录结构 find / -name mysql1.1 数据库文件的存放路径 MySQL数据库文件的存放路径&#xff1a;/var/lib/mysql/ mysql> show variables like datadir; -------------------------------- | Variable_name | Value | ---------------…

MAT查找类(岔路口)-技巧

文章目录 前言一、现状二、使用步骤1.导出 hprof2.用MAT打开3.细节操作找大对象的线程名称查看线程的详情查找类的GC Roots柳暗花明检验真理 总结 前言 又是java 内存溢出 OOM JAVA MAT 分析工具大大的好。 高效查找问题根源&#xff0c;才是硬道理。 一、现状 mat 打开hprof…

app.json: [“usingComponents“][“van-icon“]: “@vant/weapp/icon/index“ 未找到

维护一个微信小程序的项目&#xff0c;运行报错如下&#xff1a; app.json: ["usingComponents"]["van-icon"]: "vant/weapp/icon/index" 未找到解决办法 我只说我用到的&#xff0c;如果解决不了你的问题&#xff0c;详细的可以参照官方文档&…

git的介绍和安装、常用命令、忽略文件

git介绍和安装 首页功能写完了 ⇢ \dashrightarrow ⇢ 正常应该提交到版本仓库 ⇢ \dashrightarrow ⇢ 大家都能看到这个 ⇢ \dashrightarrow ⇢ 运维应该把现在这个项目部署到测试环境中 ⇢ \dashrightarrow ⇢ 测试开始测试 ⇢ \dashrightarrow ⇢ 客户可以看到目前做的…

使用 Python 和蒙特卡罗计算未来股价走势以及历史波动率和隐含波动率

一、简介 预测金融市场是定量精度和全球经济细微差别的复杂融合。在这一探索中,蒙特卡罗模拟脱颖而出,成为首要的统计工具,指导我们对未来股票价格的理解。 这种方法以摩纳哥著名的蒙特卡洛赌场命名,并不依靠运气,而是植根于严格的概率模型。想象一下在受控环境中精心策划…

Jmeter执行接口自动化测试-如何初始化清空旧数据

需求分析&#xff1a; 每次执行完自动化测试&#xff0c;我们不会执行删除接口把数据删除&#xff0c;而需要留着手工测试&#xff0c;此时会导致下次执行测试有旧数据我们手工可能也会新增数据&#xff0c;导致下次执行自动化测试有旧数据 下面介绍两种清空数据的方法 一、通过…

DIN模型和SIM模型原理与实践

文章目录 1.DIN模型原理缺点 2.SIM模型原理算法步骤1.查找2.注意力机制 参考文献 1.DIN模型 原理 计算用户Last N向量的加权平均权重是候选物品与Last N物品的相似度 缺点 注意力层的计算量正比于n&#xff08;用户行为序列的长度&#xff09;只能记录最近的几百个物品&…

HANA:计算视图-图形化Aggregation组件-踩坑小记(注意事项)

今天遇到在做HANA视图开发的时候&#xff0c;遇到一个事&#xff0c;一直以为是个BUG&#xff0c;可把我气坏了&#xff0c;具体逻辑是这样的&#xff0c;是勇图形化处理的&#xff0c;ACDOCA innerjoin 一个时间维度表&#xff0c;就这么简单&#xff0c;完全按照ACDOCA的主键…

​换电站:一个「利用户、利蔚来、利电力改革」的能源产品

换电的本质是什么&#xff1f; 我相信连蔚来车主自己也不是很清楚&#xff0c;不就是目前体验最接近油车的补能方式吗&#xff0c;还有什么&#xff1f; 「换电站是分布在城市中的采集和存储能源的触点&#xff0c;除了可为电动车用户加电&#xff0c;将来结合储能还有很多想象…

PAM从入门到精通(四)

接前一篇文章&#xff1a;PAM从入门到精通&#xff08;三&#xff09; 本文参考&#xff1a; 《The Linux-PAM Application Developers Guide》 先再来重温一下PAM系统架构&#xff1a; 更加形象的形式&#xff1a; 五、主要函数详解 1. pam_start 概述&#xff1a; PAM事务…

添加Mybatis框架支持

配置环境 1.老项目 在pom.xml中使用generate ->edit starts->添加下面俩 2.新项目 然后运行发现会有报错 2.1这是因为没有配置数据库连接信息 spring:datasource:url: jdbc:mysql://localhost:3306/java2023?characterEncodingutf8&useSSLfalse # MySQL数…

2024泰晤士世界大学排名公布(附Top200榜单)

近日&#xff0c;泰晤士高等教育世界大学排名&#xff08;THE&#xff09;发布了2024世界大学榜单&#xff0c;这表明全球高等教育领域的四大主流排名&#xff08;QS、U.S. News、ARWU、THE&#xff09;都已经尘埃落定。知识人网小编整理了泰晤士TOP前200的榜单&#xff0c;供访…

数据挖掘十大算法--Apriori算法

一、Apriori 算法概述 Apriori 算法是一种用于关联规则挖掘的经典算法。它用于在大规模数据集中发现频繁项集&#xff0c;进而生成关联规则。关联规则揭示了数据集中项之间的关联关系&#xff0c;常被用于市场篮分析、推荐系统等应用。 以下是 Apriori 算法的基本概述&#x…

发面试题:(四)synchronized和lock区别

synchronized 关键字 synchronized关键字解决的是多个线程之间访问资源的同步性&#xff0c;synchronized关键字可以保证被它 修饰的方法或者代码块在任意时刻只能有一个线程执行。 另外&#xff0c;在 Java 早期版本中&#xff0c; synchronized属于重量级锁&#xff0c;效率…

20-数据结构-内部排序-插入排序

简介&#xff1a;插入排序基本有两步&#xff0c;先是通过比较&#xff0c;得到插入位置&#xff0c;随后移动给需要插入的位置处腾空&#xff0c;最后进行值的插入。 目录 一、直接插入排序 1.1简介&#xff1a; 1.2代码 二、折半插入排序 2.1简介&#xff1a; 2.2代码…

vue项目获得开源代码之后跳过登录界面

readme运行 进入到账号和密码 找到main.js 比如说&#xff0c;以上这段代码 剩下next&#xff08;&#xff09;就成功进入了

SAP MM学习笔记37 - 请求书照合中的 追加请求/追加Credit 等概念/ 请求书的取消

有关请求书照合&#xff0c;之前学习了一部分&#xff0c;现在再来学其中的一些概念。 其实这些概念也许并不常用&#xff0c;但是你又不能不知道&#xff0c;因为客户会问。 有关请求书&#xff0c;贴一些以前学习的文章&#xff0c;以方便阅读。 SAP MM学习笔记33 - 请求书…

雷达人体感应器成品方案,智能化空间联动交互,人体存在触发应用

随着科技的快速发展&#xff0c;智能化已经成为我们生活中不可或缺的一部分。在酒店、会议室和办公室等场合&#xff0c;智能化更是显得尤为重要。 智能雷达感应器成品设备能够实时监测人体的静止存在&#xff0c;精准地探测人体存在&#xff0c;进而触发联动设备&#xff0c;…

【C++】BMI身体质量指数计算工具

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍BMI身体质量指数计算工具。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷…

信创办公–基于WPS的Word最佳实践系列 (图文环绕方式)

信创办公–基于WPS的Word最佳实践系列 &#xff08;图文环绕方式&#xff09; 目录 应用背景操作步骤1、 打开布局选项中图文环绕方式的方法2、 图文环绕三大类型 应用背景 在Word中&#xff0c;对文字和图片进行排版时&#xff0c;采用各种不同的图片与文字组合效果能够使页面…