写点什么

扒一扒面向对象编程的另一面

发布于: 1 小时前

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

 

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

 

说到面向对象,相信很多小伙伴都已经很熟悉了,毕竟像 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{        @Override    public 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 小时前阅读数: 4
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
扒一扒面向对象编程的另一面