比较分析C++、Java、Python、R语言的面向对象特征,这些特征如何实现的?有什么相同点?

一门课的课后题答案,在这里备份一下:

面向对象程序设计语言

–  比较分析C++、Java、Python、R语言的面向对象特征,这些特征如何实现的?有什么相同点?

C++ 语言的面向对象特征:

对象模型:封装

(1)  访问控制机制:

C++提供完善的访问控制机制,分别是: public,protected和private。


private, public, protected 访问标号的访问范围


public


可访问


1.该类中的函数 ; 2.子类的函数;

3.其友元函数访问;4.该类的对象访问;


protected


可访问


1.该类中的函数;2.子类的函数;

3.其友元函数访问;


不可访问


1.该类的对象访问;


private


可访问


1.该类中的函数;2.其友元函数访问;


不可访问


1.子类的函数;2.该类的对象访问;

(2)  对象的独立性:

C++中对象本身不具有独立性,也就是对象必须属于某一个类;

(3)  类本身是不是对象?

C++中类本身不是对象,对象是类的实例化;

(4)  基于类的模型,还是基于对象或原型的模型?

C++是基于类的模型

对象模型:继承

(1)  类层次结构:采用单根的类层次结构,还是任意的类层次结构?

C++采用任意的类层次结构;

(2)  继承方式:提供哪些继承方式?

C++采用三种继承方式,分别是public继承,protected继承,private继承;

 
public


protected


private


public继承


public


protected


不可用


protected继承


protected


protected


不可用


private继承


private


private


不可用

(3)  采用基于继承的模型,还是基于指派的模型?

C++是基于继承的模型

(4)  允许多重继承?还是只允许单继承?

C++允许单继承、多继承、多重继承和虚继承;

在单继承中,每个类可以有多个派生类,但是每个派生类只能有一个基类,从而形成树形结构;

C++使用虚拟继承,解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。

对象模型:多态

多态:是指同样的消息被不同类型的对象接收时导致不同的行为。

(1)  类属:虚函数

用父类的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数,这种技术可以让父类的指针有“多种形态”;

(2)  类属:模板函数

模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。

(3)  重载:同名函数

有两个或多个函数名相同的函数,但是函数的形参列表不同。在调用相同函数名的函数时,根据形参列表确定到底该调用哪一个函数。

C++语言不是“纯粹”的面向对象语言:

1)  main函数不在任何类里面;

2)  基本的数据类型不是对象;

3)  友元会破坏封装性;

4)  支持独立的函数,数据,即过程化编程

变量的语义模型:

C++采用的是值模型,可以创建静态对象或栈对象;

但只有通过对象引用或指向对象的指针才能实现面向对象的动态约束行为。

C++支持静态对象和自动对象:

静态对象:变量定义在函数外或是用static关键字修饰的变量存放在静态存储区。放在静态存储区的数据在整个程序运行期间持续有效。

自动对象:C++默认局部变量的生命期局限于所在函数的每次执行期间。只有当定义它的函数被调用时才存在的对象成为自动对象。自动对象在每次调用函数时创建和撤销。

C++ 不依赖自动废料收集(GC):

大多数 OO 语言都依赖于自动存储回收系统;

C++是例外,其设计目标之一是尽可能避免对自动存储回收的依赖,以支持系统程序设计,提高效率,减少运行时间上的不确定性。

C++提供静态约束(默认)和动态约束两种方式;

C++提供的类类型对象的转换形式如下:

dynamic_cast<T>(expression): dynamic_cast 主要用来执行“安全向下转型”(Safe downcasting),也就是用来决定某对象是否归属继承体系中的某个类型;

C++类类型对象的动态转换机制:

1)  子类向基类的向上转型(Up Cast)

2)  基类向子类的向下转型(Down Cast)

3)  横向转型(Cross Cast)

Java 语言的面向对象特征:

对象模型:封装

(1)  访问控制机制:

Java提供完善的访问控制机制,分别是: public,protected、friendly和private。


Java类中成员修饰符的访问权限

 
public


protected


friendly


private


本类






本包





×


子类




×


×


其他



×


×


×

(2)  对象的独立性:

Java中对象本身不具有独立性,也就是对象必须属于某一个类;

(3)  类本身是不是对象?

Java中类本身不是对象,对象是类的实例化;

(4)  基于类的模型,还是基于对象或原型的模型?

Java是基于类的模型;

对象模型:继承

(1)  Java采用单根的类层次结构:

单根层次结构:在Java中,所有类都应从单独一个基础类继承,终级基础类为“Object”。

(2)  继承方式:Java只有普通的extends继承方式

当创建一个类时,总是在继承,如果没有明确指出要继承的类,就总是隐式地从根类Object进行继承。

(3) 采用基于继承的模型,还是基于指派的模型?

Java是基于继承的模型

(4) 允许多重继承?还是只允许单继承?

Java中类允许单继承和多重继承;

在单继承中,每个类可以有多个派生类,但是每个派生类只能有一个基类,从而形成树形结构;

Java中接口允许多继承;

对象模型:多态

多态:是指同样的消息被不同类型的对象接收时导致不同的行为。

(1)  类属:方法覆盖

覆盖实现多态性:通过子类对父类的重定义来实   现。方法的参数个数,类型,顺序要完全相同。

(2)  重载:同名函数

重载实现多态性:通过在一个类中定义多个同名的方法来实现。方法的参数个数,类型,顺序要有所不同。

Java是接近理想的语言,但希望在形式上尽可能靠近常规语言:

1)  不存在全局变量和全局函数;

2)  main函数是类的方法;

3)  但,Java中基本数据类型以及类都不是对象。

Java除了基本类型外,变量采用引用模型,因此,Java没有必要再另外提供引用变量或指针变量机制;

Java支持静态对象和自动对象;

Java提供自动废料收集机制(GC);

Java中除了静态的方法以外,其他所有的方法都采用动态约束;

Java语言的类类型对象的动态转换机制如下:

向上转型:子类对象→父类对象

对于向上转型,程序会自动完成;格式如下:

父类   父类对象=子类实例;

向下转型:父类对象→子类对象

对于向下转型,必须明确的指明要转型的子类类型;格式如下:

子类 子类对象=(子类)父类实例;

Python语言的面向对象特征:

对象模型:封装

(1)  访问控制机制:

Python提供的访问控制机制,分别是: public和private;

Python中,如果函数、类方法和属性如果以两个下划线开头,但是不以两个下划线结束,它就是private的,其他的一切都是public的。

(2)  对象的独立性:

Python中对象本身不具有独立性,也就是对象一定属于某一个类;

(3) 类本身是不是对象?

Python中类本身是对象;

(4) 基于类的模型,还是基于对象或原型的模型?

Python是基于对象的模型;

对象模型:继承

(1)  类层次结构:采用单根的类层次结构,还是任意的类层次结构?

Python 2.2版本以后,采用单根的类层次结构;

单根层次结构:所有类是否都应从单独一个基础类继承?

在Python中,所有类都是Object类的子类

(2)  继承方式:提供哪些继承方式?

Python采用两种继承方式,分别是:

普通继承方式;

super继承方式;在super机制里可以保证公共父类仅被执行一次。

(3)  采用基于继承的模型,还是基于指派的模型?

Python是基于继承的模型

(4)  允许多重继承?还是只允许单继承?

Python允许单继承、多继承和多重继承;

在单继承中,每个类可以有多个派生类,但是每个派生类只能有一个基类,从而形成树形结构;

对象模型:多态

多态:是指同样的消息被不同类型的对象接收时导致不同的行为。

参数传递:通过动态束定机制

类属:通过Self指代对象本身

Python语言不是“纯粹”的面向对象语言:

1)  存在全局变量和全局函数;

2)  main函数不是类的方法;

3)  但Python一切皆对象。

Python 采用的是引用模型:变量通过引用建立与对象的联系;

Python支持静态对象和自动对象;

静态对象

所有语言的全局变量都是静态对象;

在Python语言中:

使用global声明全局变量;

用同样的global语句可以指定多个全局变量,比如: global x, y, z。

Python依赖自动废料收集(GC);

Python默认采用引用计数来管理对象的内存回收。

当引用计数为0时,将立即回收该对象内存,要么将对应的block标记为空闲,要么返还给操作系统。

Python中所有方法的调用都是根据对象所指向对象的类型来动态的确定(Python变量的语义模型:引用模型)。因此Python所有的方法采用的是动态约束的方式。

类类型对象的动态转换机制:

Python的类类型对象之间不提供动态转换机制;而是采用名-值(对象)动态约束机制。

R语言的面向对象特征:

R语言的面向对象系统:

基于S3的面向对象编程

基于S4的面向对象编程

基于RC的面向对象编程

基于R6的面向对象编程

面向对象语言必须具有的基本特征:

封装、数据抽象、动态绑定、继承,仅具备上述二个或三个的,不能算是面向对象语言。

基于S3的面向对象编程:

是一种泛型函数的实现方式;

泛型函数是一种特殊的函数,根据传入对象的类型决定调研哪个具体的方法;

基于S3的面向对象编程,是一种动态函数调用的模拟实现。

由于基于S3的面向对象编程,并未提供封装机制

因此,基于S3的面向对象编程不是严格意义上的面向对象语言

基于S4的面向对象编程:

是一种标准的R语言面向对象实现方式;

S4对象有明确的类定义,参数定义,参数检查,继承关系,实例化等的面向对象系统的特征。

对象模型:封装

(1) 类的定义:在基于S4的面向对象系统中,类定义的格式如下:

setClass(Class, representation, prototype, contains=character(),validity, access, where, version, sealed, package,S3methods = FALSE, slots)

类的实例化

对象名<-new("类名",属性=属性值,...)

(2) 访问控制机制:

R语言中基于S4的面向对象系统,没有提供访问控制机制;

(3) 对象的独立性:

R语言中对象不具有独立性,也就是对象必须属于某一个类;

(4) 类本身是不是对象?

R语言中基于S4的面向对象系统中,类本身是对象;

(5) 基于类的模型,还是基于对象或原型的模型?

R语言中基于S4的面向对象系统是基于泛函的模型;

对象模型:继承

(1)  继承方式:提供哪些继承方式?

S4有比S3更为严格的继承关系,用contains 参数表示。

其具有单继承和多重继承两种继承方式;

单继承

多重继承

(2)  采用基于继承的模型,还是基于指派的模型?

R语言基于S4的面向对象系统是基于指派的模型;

R语言基于S4的面向对象系统是基于指派的模型;

对象模型:多态

通过泛函函数,实现方法的多态机制

R语言中的基于S4的面向对象系统,不是“纯粹”的面向对象语言:

1)  存在全局变量和全局函数;

2)  main函数不是类的方法;

3)  但, R语言中的基于S4的面向对象系统中,一切皆为对象。

R语言中基于S4的面向对象系统,采用引用模型;

R语言中基于S4的面向对象系统支持静态对象和自动对象;

R语言中基于S4的面向对象系统依赖自动废料收集机制(GC);

R语言中基于S4的面向对象系统中所有的方法都采用动态约束;

类类型对象的动态转换机制:

R语言基于S4的面向对象系统中类类型对象之间不提供动态转换机制;而是采用名-值(对象)动态约束机制。

基于RC的面向对象编程:

1)  RC对象系统从底层上改变了原有S3和S4对象系统的设计,去掉了泛型函数;

2)  真正地以类为基础实现面向对象的特征。

对象模型:封装

(1)  类的定义

定义的格式如下:

setRefClass(Class, fields = , contains = , methods =, where =, ...)

(2)  访问控制机制:

R语言中基于RC的面向对象系统,没有提供访问控制机制;

(3)  对象的独立性:

R语言中对象不具有独立性,也就是对象必须属于某一个类;

(4)  类本身是不是对象?

R语言中基于RC的面向对象系统中,类本身是对象;

(5)  基于类的模型,还是基于对象或原型的模型?

R语言中基于RC的面向对象系统是基于对象的模型;

对象模型:继承

(1)  类层次结构:采用单根的类层次结构,还是任意的类层次结构?

R语言基于RC的面向对象系统采用任意的类层次结构;

(2)  继承方式:提供哪些继承方式?

R语言基于RC的面向对象系统沿用R4的继承方式,用contains 参数表示;

其具有单继承和多重继承两种继承方式;

单继承

多重继承

(3)  采用基于继承的模型,还是基于指派的模型?

R语言基于RC的面向对象系统是基于继承的模型;

对象模型:多态

多态:是指同样的消息被不同类型的对象接收时导致不同的行为。

类属:方法覆盖

R语言中的基于RC的面向对象系统,接近“纯粹”的面向对象语言:

1)  不存在全局变量和全局函数;

2)  但,main函数不是类的方法;

3)  R语言中的基于RC的面向对象系统中,一切皆为对象。

R语言中基于RC的面向对象系统,采用引用模型;

R语言中基于RC的面向对象系统支持静态对象和自动对象;

R语言中基于RC的面向对象系统依赖自动废料收集机制(GC);

R语言中基于RC的面向对象系统中所有的方法都采用动态约束;

类类型对象的动态转换机制:

R语言基于RC的面向对象系统中类类型对象之间不提供动态转换机制;而是采用名-值(对象)动态约束机制。

基于R6的面向对象编程

R6类型非常接近于RC类型(Reference classes),但比RC类型更轻;

由于R6不依赖于S4的对象系统,所以用R6的构建面向对象系统会更加有效率。

对象模型:封装

(1)  类的定义

在基于R6的面向对象系统中,类的定义和实例化的格式如下:

(2)  访问控制机制:

R语言中基于R6的面向对象系统,提供的访问控制机制,包括:public和private两种类型。

在类中访问公有成员时,需要使用self对象进行调用。

在类中访问私有成员变量时,要通过private对象进行访问。

(3)  对象的独立性:

R语言中对象不具有独立性,也就是对象必须属于某一个类;

(4)  类本身是不是对象?

R语言中基于R6的面向对象系统中,类本身是对象;

(5)  基于类的模型,还是基于对象或原型的模型?

R语言中基于R6的面向对象系统是基于对象的模型;

对象模型:继承

(1)  类层次结构:采用单根的类层次结构,还是任意的类层次结构?

R语言基于R6的面向对象系统采用任意的类层次结构;

(2)  继承方式:提供哪些继承方式?

R语言基于R6的面向对象系统的继承是通过inherit来实现 ,其具有单继承和多重继承两种继承方式;

单继承

多重继承

(3)  采用基于继承的模型,还是基于指派的模型?

R语言基于R6的面向对象系统是基于继承的模型;

对象模型:多态

多态:是指同样的消息被不同类型的对象接收时导致不同的行为。

类属:方法覆盖

R语言中的基于R6的面向对象系统,接近“纯粹”的面向对象语言:

1)  不存在全局变量和全局函数;

2)  但,main函数不是类的方法;

3)  R语言中的基于R6的面向对象系统中,一切皆为对象。

R语言中基于R6的面向对象系统,采用引用模型;

R语言中基于R6的面向对象系统支持静态对象和自动对象;

R语言中基于R6的面向对象系统依赖自动废料收集机制(GC);

R语言中基于R6的面向对象系统中所有的方法都采用动态约束;

类类型对象的动态转换机制:

R语言基于R6的面向对象系统中类类型对象之间不提供动态转换机制;而是采用名-值(对象)动态约束机制。

保持更新,资源来源于网络。

原文地址:https://www.cnblogs.com/xuyaowen/p/OO.html

时间: 2024-10-11 13:23:05

比较分析C++、Java、Python、R语言的面向对象特征,这些特征如何实现的?有什么相同点?的相关文章

Java调用R语言

R是统计计算的强大工具,JAVA是做应用系统的主流语言.JAVA负责系统的构建,R用来做运算引擎,从而实现应用型和分析性相结合的系统. 一.Rserve(远程通信模式) Rserve是一个基于TCP/IP的服务器,通过二进制协议传输数据,可以提供远程连接,使得客户端语言能够调用R. Rserve作为一个package发布在CRAN上,可以直接使用install.packages("Rserve")进行安装.需要使用时在R控制台下加载该包,然后输入命令Rserve(),开启服务器就可以供

R语言分析(二)——薛毅R语言第二章后面习题解析

包括2.2—2.6中间的习题,2.2的习题中第三问和第四问,应该有其他的解答方法,但我看他的题目,似乎是在A和B的基础上进行,所以就选择了使用for循环的方法 做着习题,又不断查着书,这样,书籍也熟悉了,习题也做完了,感觉特别爽的还是... 解答:上面题目中第二小问是个错误的,改写成D=A ,才有下面的答案 (1)(2)(3): (4): (5): 2.3题答案: 2.4题答案: 2.5题的答案: 完成的答案如下图所示: 1,生成纯文本和csv,并读取 2,使用excel打开生成的csv

R语言︱情感分析—词典型代码实践(最基础)(一)

笔者寄语:词典型情感分析对词典要求极高,词典中的词语需要人工去选择,但是这样的选择会很有目标以及针对性.本文代码大多来源于<数据挖掘之道>的情感分析章节.本书中还提到了监督算法式的情感分析,可见博客: R语言︱情感分析-基于监督算法R语言实现笔记. 可以与博客 R语言︱词典型情感分析文本操作技巧汇总(打标签.词典与数据匹配等)对着看. 词典型情感分析大致有以下几个步骤: 训练数据集.neg/pos情感词典.分词+数据清洗清洗(一.二.三级清洗步骤).计算情感得分.模型评价 ----------

第七届R语言会议 - 小记

第七届中国R语言会议 小记 R语言始于1993年,并在1995年首次发布,后来经过2000年R-1.0,2004年R-2.0和2013年R-3.0,以61%的得票荣登世界编程或同积累语言排行榜榜首,远超Python,SQL,SAS,JAVA,Excel和Rapidminer. R最初是一种基于数学的脚本语言,前身为S语言.但是论数学,远不及专业的Matlab和SAS:论脚本功能,又远不及Python和Perl.但是,随着R语言的发展,在功能强大的IDE,RStudio和R本身开源的双重帮助下,R

R语言中文社区历史文章整理(类型篇)

R语言中文社区历史文章整理(类型篇) R包: R语言交互式绘制杭州市地图:leafletCN包简介 clickpaste包介绍 igraph包快速上手 jiebaR,从入门到喜欢 Catterplots包,让你绘制不一样的图 今天再来谈谈REmap包 ggplot2你需要知道的都在这... R访问数据库管理系统(通过RODBC包和RMySQL包两种方式) NLP--自然语言处理(三)text2vec包 Rattle:数据挖掘的界面化操作 借助caret包实现特征选择的工作 R语言的高质量图形渲染

CentOS环境下R语言的安装和配置

最近在看数据统计和分析,想到了R语言,于是就着手在自己的CentOS环境下进行安装和配置.步骤如下: 1.前往R官网下载安装包. 2.解压压缩包:tar xvzf R-3.2.2.tar.gz 3.进行编译:./configure --prefix=/usr/local/rscript(--prefix的内容自定,这是R的安装目录) 注意:此过程中可能会出现以下错误: --with-readline=yes (default) and headers/libs are not available

R语言基于S4的面向对象编程

前言 本文接上一篇文章 R语言基于S3的面向对象编程,本文继续介绍R语言基于S4的面向对象编程. S4对象系统具有明显的结构化特征,更适合面向对象的程序设计.Bioconductor社区,以S4对象系统做为基础架构,只接受符合S4定义的R包. 目录 S4对象介绍 创建S4对象 访问对象的属性 S4的泛型函数 查看S4对象的函数 S4对象的使用 1 S4对象介绍 S4对象系统是一种标准的R语言面向对象实现方式,S4对象有明确的类定义,参数定义,参数检查,继承关系,实例化等的面向对象系统的特征. 2

[转] Twitter的分布式自增ID算法Snowflake实现分析及其Java、Php和Python版

转载自:http://www.dengchuanhua.com/132.html 在分布式系统中,需要生成全局UID的场合还是比较多的,twitter的snowflake解决了这种需求,实现也还是很简单的,除去配置信息,核心代码就是毫秒级时间41位+机器ID 10位+毫秒内序列12位. 该项目地址为:https://github.com/twitter/snowflake是用Scala实现的. python版详见开源项目https://github.com/erans/pysnowflake.

R语言学习-词频分析

概念 1.语料库-Corpus 语料库是我们要分析的所有文档的集合,就是需要为哪些文档来做词频 2.中文分词-Chinese Word Segmentation 指的是将一个汉字序列切分成一个一个单独的词语. 3.停用词-Stop Words 数据处理的时候,自动过滤掉某些字或词,包括泛滥的词如Web.网站等,又如语气助词如的.地.得等. 需要加载的包 1.tm包 安装方式:install.packages("tm") 语料库: Corpus(x,readerControl) x-语料