摘要:尽管有很多小伙伴对面向对象的概念已经很很熟了,但是到底什么是面向对象编程?面向对象有哪些特性?面向对象编程能够为我们带来哪些便利?面向对象又有哪些不足呢?

本文分享自华为云社区《【云驻共创】被吹捧了很多年的面向对象编程真的就这么完美吗?》,作者: 冰 河 。

说到面向对象,相信很多小伙伴都已经很熟悉了,毕竟像Java、C++这种编程语言长期排在编程语言榜的前列,而且几乎每一所大学的软件工程专业和计算机专业都会开设Java和C++相关的课程。在上学时,老师就会给我们将什么是对象、什么类。比如:在Java中,万物皆对象。

说到这儿,尽管有很多小伙伴对面向对象的概念已经很很熟了,但是到底什么是面向对象编程?面向对象有哪些特性?面向对象编程能够为我们带来哪些便利?面向对象又有哪些不足呢?

很少有人深究过这些问题,相信不少小伙伴都是都是一知半解的,今天,我们就一起来聊聊面向对象这个话题。

什么是面向对象编程?

首先,我们来聊聊什么是面向对象编程。面向对象编程的英文是Object Oriented Programming,简称OOP。在面向对象中有两个最重要,也是最基本的概念,那就是:类和对象。

这两个概念最早出现到 Simula 编程语言中。而真正第一次使用面向对象编程这个概念的是在 Smalltalk 语言中。而 Smalltalk 语言也被公认为是世界上第一个真正意义上的面向对象编程语言。

发展到今天,面向对象的编程语言越来越多,像C++、Java、Go、Python、C#、Object-C、Scala等都是面向对象编程语言。

其实,面向对象编程和面向对象编程语言是有着本质的区别的。

面向对象编程: 面向对象编程更多的是指一种编程约束,以类和对象这两个概念作为输出的载体,并提供 封装、继承、抽象、多态 四个特性。

面向对象编程语言: 面向对象编程语言本质上就是一种输出表达面向对象的工具,它能够将程序员的所思所想转换成计算机能够识别的二进制码,最终能够在计算机上运行。

面向对象有哪些特性?

前面我们已经简单的提及了面向对象的四大特性:封装、继承、抽象和多态 。

封装

封装,顾名思义,就是将要访问的数据保护起来,不让外界直接访问类的属性和字段,而是对外提供有限的访问接口,授权外部仅能通过类提供的接口进行访问。例如,我们以Java语言为例,写一个只包含用户姓名userName和用户年龄userSex的User类。

public class User{private String userName;private Integer userSex;public void setUserName(String userName){this.userName = userName;}public String getUserName(){return this.userName;}public void setUserSex(Integer userSex){this.userSex = userSex;}public Integer getUserSex(){return this.userSex;}
}

在这个User类中,总共有两个属性,也叫做类的成员变量,分别为userName和userSex。userName表示用户的姓名,userSex表示用户的名称。

我们无法直接访问User类中的userName和userSex属性,因为它们都是被privaite修饰符修饰的。但是我们可以通过如下四个方法访问者两个属性。

  • void setUserName(String userName)
  • String getUserName()
  • setUserSex(Integer userSex)
  • Integer getUserSex()

这种封装特性能够提高类的易用性,减少编程过程中代码出错的风险。

继承

继承在编程语言里最直接的体现就是父子类的关系,在Java中使用 extends 关键字实现继承,而在C++中使用冒号(:) 表示继承关系。

例如,我们以 Java 语言为例,创建一个Student类,继承User类,如下所示。

public class Student extends User{private String studentNo;public void setStudentNo(String studentNo){this.studentNo = studentNo;}public String getStudentNo{return this.studentNo;}
}

此时,Student 类对象就能够通过 User 类对象提供的 public 方法访问 User 类对象的属性。

继承最大的好处就是能够实现代码的复用。

抽象

抽象主要指的是隐藏方法的具体实现,让方法的调用者无需关心方法的具体实现,只需要关心类提供了哪些功能即可。

例如,在 Java 编程语言中,实现抽象最直观的就是 接口和抽象类。 接口使用 interface 关键字修饰, 抽象类使用 abstract 关键字修饰。

例如,以 Java语言为例,Student 类的业务逻辑接口 StudentService 如下所示。

public interface StudentService{public abstract Student getStudentByNO(String studentNo);
}

实现 StudentService 接口的 AbstractStudent 抽象类。

public abstract class AbstractStudent{@Overridepublic Student getStudentByNO(String studentNo){//省略无数代码return student;} public abstract void visitStudent(String studentNo);
}

抽象更多的是能够让程序的设计和实现分离。

多态

多态指的是子类可以替换父类,实际运行程序的代码时,调用子类的方法实现。例如,下面的User类和Student类。

User类:

public class User{private String userName;private Integer userSex;public void setUserName(String userName){System.out.println("调用User类的setUserName()方法...");this.userName = userName;}public String getUserName(){return this.userName;}public void setUserSex(Integer userSex){this.userSex = userSex;}public Integer getUserSex(){return this.userSex;}
}

Student类:

public class Student extends User{private String studentNo;public void setUserName(String userName){System.out.println("调用Student类的setUserName()方法...");this.userName = userName;}public void setStudentNo(String studentNo){this.studentNo = studentNo;}public String getStudentNo{return this.studentNo;}
}

我们运行如下代码。

public static void main(String[] args){User user = new Student();user.setUserName("冰河");
}

此时,会在命令行输出如下语句:

调用Student类的setUserName()方法...

多态最大的好处就是提高了程序的可扩展性。

面向对象编程有哪些好处?

面向对象编程是有诸多好处的,例如文章前面介绍的如下优点:

  • 封装特性能够提高类的易用性,减少编程过程中代码出错的风险。
  • 继承最大的好处就是能够实现代码的复用。
  • 抽象更多的是能够让程序的设计和实现分离。
  • 多态最大的好处就是提高了程序的可扩展性。

除此之外,面向对象编程在并发领域也是由明显的优势的。在并发编程领域,我们可以使用面向对象的封装特性将共享变量封装到一个类中,并且这个共享变量使用 private 修饰,也就是说这个共享变量无法被外界直接访问。它只能通过这个类提供的有限个方法进行访问,并且这些方法都通过加锁的方式保证线程安全。这就避免了多个线程同时方法这个共享变量引起的线程安全问题。

面向对象编程有哪些不足?

尽管面向对象编程存在着诸多的好处,但是它也有美中不足的部分。

  • 万物皆对象,大量的创建对象会占用大量的内存空间。
  • 需要有一定的软件支持环境。
  • 不太适用于开发一些计算机底层的应用,例如芯片开发,单片机开发等。
  • 不太适用于一些大型的MIS系统的开发。
  • 性能不如面向过程编程高。
  • 不适合开发实时性要求特别高的指令传输系统。

点击关注,第一时间了解华为云新鲜技术~

扒一扒面向对象编程的另一面相关推荐

  1. C++(15)--面向对象编程实践-欢乐斗地主(vector的花式输出)

    面向对象编程实践-欢乐斗地主 <老九学堂C++课程><C++ primer>学习笔记.<老九学堂C++课程>详情请到B站搜索<老九零基础学编程C++入门> ...

  2. 扒一扒传智播客深藏在背后的内幕

        扒一扒传智播客深藏在背后的内幕 -- 传智坚持开Java基础班有何猫腻 Java基础太简单,自学一个月就能搞定?大学学了计算机基础的,感觉报基础班有点浪费钱,浪费时间!找工作会项目都行了,基础 ...

  3. 185页深度报告 扒一扒AI金融的老底【附下载】

    来源:智东西 概要:2016年,中国爆出8家独角兽,总估值964亿美元位冠全球:2017年,毕马威全球百佳金融科技企业前三甲,蚂蚁金服.众安保险.趣店,皆来自中国:过往两年,中国成立的金融科技创企达1 ...

  4. 扒一扒.NET Core的环境配置提供程序

    前言 很久之前,在玩Docker的时候顺便扒了扒,最近,终于下定决心花了些时间整理并成文,希望能够给大家一些帮助. 目录 .NET Core中的配置 ASP.NET Core中的配置 扒一扒环境变量提 ...

  5. 扒一扒编程语言排行榜

    我们公司的课程主推Python , 人工智能首选语言, 2019年 排行第一." "我们是Java编程课程,Java常年排名第一" "JavaScript才是编 ...

  6. 扒一扒最让人后悔的专业,你躺枪了吗?

    作者:想重新高考的DT君 来源:DT财经 又到了一年一度的高考时刻. 12年临窗苦读,成败在此一举?不不不,高考结束后的专业选择,或许才是人生的重要转折.毕竟每年都有太多还没从高考结束的撒欢状态中脱离 ...

  7. 【面向对象编程】(4) 类的继承,重构父类中的方法

    各位同学好,今天和大家分享一下面向对象编程中,类的三大特征之继承.主要介绍:子类继承父类的基本方法:重写父类的类方法:重构父类的初始化方法:super() 方法.本节主要是单继承,多继承在下一节中介绍 ...

  8. 【面向对象编程】(3) 类之间的交互,依赖关系,关联关系

    各位同学好,今天和大家分享一下面向对象编程中,类之间的交互,类之间的依赖关系和关联关系.有不明白的可见前一章节:https://blog.csdn.net/dgvv4/article/details/ ...

  9. 【面向对象编程】(1) 类实例化的基本方法

    各位同学好,本章节和大家分享一下面向对象编程的一些方法,通过一些案例带大家由浅入深掌握面向对象的编程. 1. 最基本的类实例化 创建类的方法是 class 变量名: ,实例化方法是 类名() ,分配属 ...

最新文章

  1. Javascript在IE中的有趣错误
  2. 二进制的mysql怎么装_使用二进制演示MySQL安装步骤
  3. (转)软件开发人员如何提高自己的软件专业技术方面的具体建议
  4. 两线怎么接三线插座图_水温传感器怎么判断好坏
  5. [html] 如何阻止屏幕旋转时自动调整字体的大小?
  6. vs2013 没有ef mysql_vs2013 EF Mysql
  7. DevExpress.XtraTreeList.TreeList的DataSource属性使用注意事项.
  8. MapStruct 代码生成器
  9. c语言五大常用算法,C语言------五大常用算法总结
  10. 8uftp怎么上传文件,8uftp怎么上传文件
  11. hp linux 禁用u盘启动不了,u盘启动禁用旧版启动模式并启用UEFI
  12. 非接触物体尺寸形态测量(G 题)
  13. 20 个短小精悍的 pandas 骚操作
  14. 腾讯云cos对象存储服务文件上传api就是一个大坑
  15. shell无限死循环
  16. Postman+Newman+Git+Jenkins+Slack 接口自动化和监控
  17. 关于SAXReader 读取文件乱码问题
  18. LTE-A载波聚合技术(14)---PHICH
  19. 精心整理了100+Python字符串常用操作,备用
  20. 【算法•日更•第十二期】信息奥赛一本通1585:【例 1】Amount of Degrees题解

热门文章

  1. CSS 匿名文本和匿名框
  2. 视觉SLAM笔记(23) 图像
  3. tomcat下多个app 不同的图标_5G SA网络切片下,独立APP应用如何自行接入不同网络切片...
  4. java 全排序_Java排序算法全
  5. 2019 牛客多校第三场 B Crazy Binary String
  6. eclipse要修改的配置
  7. 5分钟速成C++14多线程编程
  8. docker重命名镜像
  9. ReactNative-地图导航-iOS
  10. 进程间通讯-3(Manager)-实现数据的同时修改