编程语言和面向对象浅谈
编程语言是一种计算机语言,用于编写计算机程序或脚本的一种形式化语言,用于指示计算机执行特定的任务或操作。编程语言的种类很多,包括高级语言(如Java、Python、C++、JavaScript)和低级语言(如汇编语言)。编程语言可以用于开发各种类型的计算机应用程序,包括网站、桌面应用程序、移动应用程序、操作系统、游戏等。
编程范式法(Programming paradigm),是指软件工程中的一类典型的编程风格(或者说是编程方式)。常见的编程范型有:函数式编程、指令式编程、过程式编程、面向对象编程等等。一些语言是专门为某个特定的范型设计的,如 Smalltalk 和 Java 支持面向对象编程,而 Haskell 和 Scheme 则支持函数式编程,同时还有另一些语言支持多种范型,如C++、Python、Rust。
编程范型和编程语言之间的关系可能十分复杂,由于一个编程语言可以支持多种范型。例如,C++ 设计时,支持过程式编程、面向对象编程。一程序员可以用 C++ 写出一个完全过程化的程序,另一个人也可以用 C++ 写出一个纯粹的面向对象程序,甚至还有人可以写出杂揉了两种范型的程序。
过程式编程:面向过程的思想是把一个项目、一件事情按照一定的顺序,从头到尾一步一步地做下去,先做什么,后做什么,一直到结束。这种思想最好理解,和我们日常做事情的方法一致。
意思就是在编写代码的时候,要解决的问题被看作是一个个要完成的任务,之所以又叫结构化设计语言是因为,它主要是采用自顶向下、逐步求精的程序设计方法,使用三种基本控制结构:顺序、选择、循环。
程序流程图是过程化语言进行程序编写的有效辅助手段。
过程化语言特别适合解决线性(或者说按部就班)的算法问题。它强调“自上而下(自顶向下)” “精益求精”的设计方式。这种方式非常类似我们的工作和生活方式,因为我们的日常活动都是按部就班的顺序进行的。
面向对象编程
“面向对象”的英文名为“objective oriented”意思是,“以客体为导向”。
面向对象编程/面向对象程序设计(Object-oriented programming OOP)是种通过类、方法、对象和消息传递,来支持面向对象的程序设计范式。对象则指的是类的实例。在面向对象程序编程里,程序会被设计成彼此相关的对象,将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
【面向对象编程中“消息”:
1.方法调用:在许多面向对象的编程语言中,消息传递是通过方法调用来实现的。当一个对象调用另一个对象的方法时,它实际上是在向该对象发送一个消息,请求它执行该方法定义的操作。也可以说,方法调用不仅仅是函数调用,它还涉及到对对象内部状态的操作以及对象间的交互。例如,当一个对象调用另一个对象的方法时,它是在请求接收对象执行某个操作,这个请求即是消息。
2.事件和监听器:在某些编程框架中,消息传递也可以通过事件和监听器机制来实现。一个对象可以发布一个事件(即发送一个消息),而感兴趣的其他对象可以注册为监听器来接收该事件(即接收消息)。这种机制在图形用户界面(GUI)编程和异步编程中非常常见。】
当我们提到面向对象的时候,它不仅指一种程序设计方法。它更多意义上是一种程序开发方式。在这一方面,我们必须了解更多关于面向对象系统分析和面向对象设计(Object Oriented Design,简称OOD)方面的知识。
对于OOP的准确定义及其本意存在着不少争论。通常,OOP被理解为一种将程序分解为封装(Encapsulation)数据及相关操作的模块而进行的编程方式。支持面向对象编程语言通常利用继承(inheritance)其他类实现代码重用和可扩展性的特性。
类有两个主要的概念:
类(Class):定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。在程序中,类(Class)实际上就是数据类型(type),描述了一组有相同特征/状态(数据成员)和相同行为(方法——成员函数)的对象。
对象(Object):是类的实例(Instance)。与通常所认为的经典面向对象程序设计Java不同,在有些语言如python,一切都是对象,类也是对象,即对象指类和它们的实例这两者。https://www.cnblogs.com/traditional/p/13391098.html
面向对象的封装、继承、多态,使软件大规模化成为可能,它实践了软件工程的三个目标:可维护性、可重用性、可扩展性。对于小规模程序来说,面向对象确实意义不大。
封装(Encapsulation)封装包含两个含义。第一个是在面向对象编程中对象将变量(状态)和 方法(用来改变状态或执行涉及状态的计算)集中在类(或对象)中。第二个指的是隐藏类的内部数据,以避免客户端代码(即类外部的代码)直接进行访问。例如,将对应的行为抽取为方法,状态数据抽取为属性,创建良好的类。
封装可以尽可能地隐藏内部的细节,只保留一些对外接口(interface)使之与外部发生联系,可以使我们容易地修改类的内部实现,而无需修改使用了该类的代码。
【注:接口(interface)有多种含义
1.在编程中,将类对外暴露的公共方法和属性等成员称为接口(interface),目的是使其能被内部修改而不影响外界其他实体与其交互沟通的方式;
2.在编程中,只包含方法声明但没有具体实现的接口,需要使用关键字"interface"来定义;
3.计算机网络中,用于描述不同系统之间的连接点或共享的边界,例如网络接口、API接口等。】
对象能够接受什么请求,是由它的“接口”决定的,而对象所归属的类定义了这些接口。
如何能让一个对象真正发挥其作用呢?答案是向对象发送请求。向对象发送消息,可以用一个英文句号(.)将对象名和请求(即方法)连接起来。
封装,简单地说就是把一系列的逻辑写在一个类里,对外只暴露必要的[成员]变量和方法。
继承(Inheritance)是指,在某种情况下,一个类会有“子类”。子类比原本的类(称为父类)要更加具体化。继承最大好处就是“代码重用”。继承就是子类拥有父类所有的变量和方法,子类继承父类,意思是把父类的成员(变量和方法)拿来直接使用,减少代码的重复开发,达到复用。
继承,简单地说是使用已存在的类(父类)作为基础建立新类的技术,新类(子类)的定义可以增加新的数据或新的功能,也可以用父类的功能。实际上继承者(子类)是被继承者(父类)的特殊化,它除了拥有被继承者的成员(变量和方法)外,还拥有自己独有的成员(变量和方法)。
多态(Polymorphism)是指由继承而产生的相关的不同的类,其对象对同一消息会做出不同的响应。多态不太好理解,多态的形式多样,实现方式多样【https://zhuanlan.zhihu.com/p/533706615】,其中一种是多个方法使用同一个名字:一个父类的多个子类可以为同一个函数提供不同的实现,表现出多种行为——子类重写父类的方法。下面给出一个简单Java语言例子,演示了同名方法产生不同效果的目的:
public class demoPolymorphism {
public static void main(String[] args) {
People p=new student();
p.eat(); //调用eat(),输出"吃水煮肉片"
People s=new teacher();
s.eat(); //调用eat(),输出"吃樱桃"
}
}
class People{
public void eat(){
System.out.println("吃饭");
}
}
class student extends People{
@Override
public void eat(){
System.out.println("吃水煮肉片");
}
}
class teacher extends People{
@Override
public void eat(){
System.out.println("吃樱桃");
}
}
特别提示,请不要纠结此例简单到没什用处,应从了解多态的意图角度着想,方便扩展,如若想添加学校管理行政人员(staff),可以添加一个子类class staff extends People,而无需修改原来的类,这对大的项目还是很有意义的。
编程语言是描述程序的方法,每种具体语言都有其特点,不同的编程语言提供的具体实现机制和描述术语不太一样,如Java、C++、Java Script、python面向对象程序设计不太一样,学一门编程语言就不得不去研究一些例子,通过例子来揣摩各种术语真正的含义。
下面用Java语言编程,计算两个数的和为例,直观认识面向过程编程和面向对象编程的区别
Java允许程序员使用过程化编程风格的代码? Java是一门面向对象的编程语言,但它仍然允许程序员使用过程化编程风格的代码。
尽管Java是一门面向对象的编程语言,但它并不强制要求所有的代码都必须按照面向对象的方式编写。Java支持面向对象编程范式,并提供了类、对象、继承、封装等面向对象的特性,鼓励程序员使用面向对象的思想来组织和设计代码。
然而,Java也支持其他编程范式,如过程化编程和函数式编程。程序员可以在Java中编写过程式风格的代码,使用静态方法和静态变量,而不需要创建对象。此外,Java 8引入了函数式编程的概念,通过Lambda表达式和函数式接口,可以使用函数式编程的风格来编写代码。
面向过程编程(Procedure-Oriented Programming)与面向对象编程(OOP:Object-Oriented Programming)的对比:
面向过程编程主要关注程序的执行步骤和函数或过程的调用顺序。它将程序分解为一系列函数或过程,数据在这些函数或过程中被逐步转换和处理。面向过程编程更加注重解决问题的步骤和算法。
面向对象编程则更加关注对象的创建和使用。它将数据(属性)和操作数据的方法(函数)封装在类中,通过创建对象来使用这些类。对象之间通过消息传递(方法调用)来进行交互,从而实现程序的功能。面向对象编程更加注重数据的组织和封装,以及对象之间的关系和交互。
若要使用面向对象编程(OOP)的风格,可以定义一个类来表示一个具有加法功能的对象。下面是一个使用面向对象编程风格的写法:
下面给出用Java语言计算两个数之和,采用面向过程编程与面向对象编程实现的源码
若要使用面向对象编程(OOP)的风格,可以定义一个类来表示一个具有加法功能的对象。下面是使用面向对象编程风格的写法:
public class Calculator {
// 这是一个面向对象编程风格的方法,用于计算两个整数的和
public int add(int a, int b) {
return a + b;
}
// 主函数,程序的入口点
public static void main(String[] args) {
// 创建一个Calculator对象
Calculator calculator = new Calculator();
// 调用对象的方法add来计算两个数的和
int sum = calculator.add(5, 3);
// 打印结果
System.out.println("Addition result: " + sum);
}
}
在这个示例中,定义了一个名为Calculator的类,它包含一个add方法用于执行加法操作。在main方法中,首先创建了一个Calculator对象(即实例化了该类),然后通过这个对象调用了add方法来计算两个数的和。这样,就把数据和操作数据的方法封装在了一个对象中,符合面向对象编程的原则。
上面的写法,加法操作封装在一个类中,保存为一个文件。
还可以采用如下写法,使用了两个类,保存为二个文件,其中一个类用于进行加法计算,另一个类用于演示调用。【在更复杂的场景中,使用多个类来封装不同的功能可能更具可扩展性和灵活性。】
public class Addition {
public int add(int a, int b) {
return a + b;
}
}
public class ObjectOrientedExample {
public static void main(String[] args) {
Addition addition = new Addition(); // 创建Addition对象
int result = addition.add(5, 3); // 调用实例方法进行加法运算
System.out.println("Addition result: " + result);
}
}
这个简单的面向对象编程(OOP)的示例包含两个类:
Addition类包含一个公共方法add,该方法接收两个整数参数a和b,并返回它们的和。
ObjectOrientedExample类包含程序的主入口点,即main方法。在main方法中,程序创建了一个Addition类的对象,并调用该对象的add方法。
虽然Java是一种面向对象的语言,但它也允许开发者使用过程化编程的方式来编写代码,尤其是在处理一些较为简单或线性的问题时。
以下是使用过程化编程风格来编写一个计算两个数之和的程序:
public class ProcedureOrientedExample {
// 这是一个过程化编程风格的函数,用于计算两个整数的和
public static int add(int a, int b) {
return a + b;
}
// 主函数,程序的入口点
public static void main(String[] args) {
// 调用过程化函数add来计算两个数的和
int sum = add(5, 3);
// 打印结果
System.out.println("Addition result: " + sum);
}
}
在上面的示例中,add方法就是一个典型的过程化函数,它接受两个整数作为参数,并返回它们的和。这个方法并不依赖于任何对象的状态,而是直接执行其计算并返回结果。
附录1
下面是我写的几种常见语言面向对象博文:
程序设计中的基本概念 https://blog.csdn.net/cnds123/article/details/108810035
C++面向对象程序设计 https://blog.csdn.net/cnds123/article/details/109141006
Java面向对象 https://blog.csdn.net/cnds123/article/details/110915227
Python面向对象程序设计 https://blog.csdn.net/cnds123/article/details/108354860
JavaScript面向对象编程 https://blog.csdn.net/cnds123/article/details/129982056
面向对象编程三大特征介绍https://blog.csdn.net/cnds123/article/details/131931698
附录2
JavaScript面向对象编程 https://cloud.tencent.com/developer/article/1830453
怎么理解面向对象?https://www.zhihu.com/question/313687376
OOP编程思想 https://zhuanlan.zhihu.com/p/88176396
怎样解决编程语言之间的差异性问题?https://blog.csdn.net/qq_34079398/article/details/81560918
什么是面向对象,它的三个基本特征:封装、继承、多态 https://blog.csdn.net/weixin_51201930/article/details/122652397