【面向对象】对比JavaScript、Go、Ada、Python、C++、Java、PHP的访问限制。

在不同编程语言中,控制成员(变量、方法、类等)可见性的机制不尽相同。以下是对比JavaScript、Go、Ada、Python、C++、Java、PHP所使用的访问限制关键字和约定:

一、JavaScript

### JavaScript访问限制

早期的JavaScript并没有类似其他语言的访问限制。ES6之后的JavaScript引入了类,但是没有内置的`public`、`private`或`protected`关键字。

- **public**: 默认情况下,所有JavaScript对象属性和方法都是公共的。
- **private**: 通过闭包可以实现私有性。ES2020 引入了用 # 前缀来定义私有字段的特性。
- **protected**: JavaScript不提供原生的protected关键字或类似机制。

### JavaScript示例

在ES6及其以后版本中,可以用类的语法,并通过闭包或者`#`前缀实现私有属性和方法。

class Example {constructor() {this.publicProperty = "I am public";this._protectedProperty = "I am protected";  // 没有语言层面的保护,只是一个命名约定。this.#privateProperty = "I am private";      // ES2020引入的私有字段。}publicMethod() {console.log(this.publicProperty);}_protectedMethod() {console.log(this._protectedProperty);}#privateMethod() {console.log(this.#privateProperty);}
}const example = new Example();
example.publicMethod(); // 正常工作
example._protectedMethod(); // 可以工作,但不被推荐,因为它违反了命名约定
//example.#privateMethod();  // 会抛出语法错误,私有方法不能在类的外部被访问

二、Go

### Go访问限制

Go 语言有一个独特的访问控制模型。

- **public**(可导出的): 如果标识符的首字母是大写字母,则该标识符可从其他包访问。
- **private**(不可导出的): 小写字母开头的标识符在其所在的包之外是不可见的。Go没有`protected`或`friend`关键字。

### Go示例

在Go里面,公开(Public)和私有(Private)是通过标识符的首字母是否大写来区分的。

package mainimport ("fmt"
)type Example struct {PublicProperty string  // 公开属性privateProperty string // 私有属性
}func (e *Example) PublicMethod() {fmt.Println(e.PublicProperty)
}func (e *Example) privateMethod() {fmt.Println(e.privateProperty)
}func main() {example := Example{"I am public", "I am private"}example.PublicMethod()    // 正常工作//example.privateMethod() // 无法访问,因为它是私有方法
}

三、Ada

### Ada访问限制

Ada使用包(packages)进行模块化管理,其访问控制机制基于包的规范和体(specification 和 body)。

- **public**: 包规范中声明的实体默认为公共的。
- **private**: 可以在包规范的私有部分声明私有类型或子程序。
- **protected**: Ada提供了受保护类型(protected types)来支持同步并发访问。

Ada语言中没有直接对应于`friend`关键字的概念。

### Ada示例

在Ada中,包规范中声明的是公开的,而在包体中实现但不在规范中声明的是私有的。

-- 假设该文件名为 example.adb
package Example isprocedure Public_Procedure;
privateprocedure Private_Procedure;
end Example;package body Example isprocedure Public_Procedure isbegin-- implementationend Public_Procedure;procedure Private_Procedure isbegin-- implementationend Private_Procedure;end Example;-- 另一个文件或包使用 Example
with Example;
procedure Use_Example is
beginExample.Public_Procedure;  -- 正常工作-- Example.Private_Procedure; -- 将引发编译错误,因为这是私有程序
end Use_Example;

四、Python

### Python访问限制

Python通过命名约定来区分成员的访问级别,没有严格的访问控制关键字。

- **public**: 默认情况下,所有成员都是公共的。
- **protected**: 遵循约定,以一个下划线(_)开头的成员被视为保护成员。
- **private**: 以双下划线(__)开头的成员被视为私有的,Python会对其名称进行改写以防止外部直接访问。

在Python中,没有`friend`类似的机制,但由于私有性是基于名称改写实现的,严格意义上并不是绝对的私有。

### Python示例

Python中,以单下划线开头的属性或方法约定为受保护的,以双下划线开头的属性或方法为私有的。

class Example:def __init__(self):self.public_property = "I am public"self._protected_property = "I am protected"self.__private_property = "I am private"def public_method(self):print(self.public_property)def _protected_method(self):print(self._protected_property)def __private_method(self):  # Private method with name manglingprint(self.__private_property)example = Example()
example.public_method()         # 正常工作
example._protected_method()     # 工作,但不建议外部直接调用
#example.__private_method()    # 将导致 AttributeError,因为方法名已改写
#example._Example__private_method() # 这样是可以通过改写的名字访问私有方法

五、C++

### C++访问限制

C++支持详细的访问控制机制,包括朋友类和友元函数。

- **public**: 成员在任何地方都可以被访问。
- **private**: 成员只能在定义它们的类中被访问。
- **protected**: 成员不能在类的外部访问,但可以在派生类中访问。
- **friend**: 可以让某个独立的函数或其他类的成员访问类的私有或受保护成员。

### C++示例

C++支持public、private和protected访问限制,以及friend关键字。

class MyClass {
public:MyClass(int value) : publicProp(value) {}int publicMethod() {return publicProp;}protected:int protectedProp;private:int privateProp;int privateMethod() {return privateProp;}friend class FriendClass; // FriendClass has access to private members of MyClass
};class FriendClass {
public:int accessPrivateMethod(MyClass &myClass) {return myClass.privateMethod();}
};

六、Java

### Java访问限制

Java的访问控制修饰符较为直观,与C++相似,但没有`friend`关键字。

- **public**: 类、方法、字段对所有类可见。
- **private**: 类、方法、字段仅在定义它们的类内部可见。
- **protected**: 方法和字段可以在同一个包的所有类中访问,并且在其他包的子类中也是可访问的。
- **默认**(无修饰符): 如果成员没有访问修饰符,则它在同一个包中的类可以访问,但不能被不同包中的类访问。

不同的访问限制策略为不同的编程场景提供了灵活性和封装性,帮助程序员编写结构良好并且安全的代码。在实际开发中,选择合适的访问控制层级可以减少意外的错误和降低维护成本

### Java示例

Java中也使用 public、private 和 protected关键字,没有 friend 关键字。

public class Person { // 公有类,可以在其他类中访问(public修饰符)  private String name = "Alice"; // 私有成员,只能在Person类内部访问(private修饰符)  protected int age = 25;       // 保护成员,只能在Person类内部和继承该类的子类中访问(protected修饰符)  public void sayHello() {      // 公有方法,可以在类外部和内部访问(public修饰符)  System.out.println("Hello, my name is " + name); // 可以访问name字段,因为它是公有成员(虽然声明为private,但在sayHello()方法中可访问)  System.out.println("I'm " + age + " years old."); // 可以访问age字段,因为它是保护成员(protected修饰符)或公有成员(public修饰符)  }  
}

七、PHP

### PHP访问限制

PHP是一种服务端的脚本语言,在面向对象编程方面提供了以下访问修饰符:
public:成员变量和方法对所有类都是可访问的。
protected:成员变量和方法对当前类和继承该类的子类是可访问的。
private:成员变量和方法仅对定义它们的类是可访问的。PHP没有`friend`关键字或双下划线开头的约定。

### PHP示例

PHP中的类成员可以被标记为public、private或protected。此外,PHP 5引入了final关键字和__construct()魔法方法。

class ExampleClass {private $privateVar;  // 只在此类内部可访问protected $protectedVar;  // 在此类及其子类内部可访问public $publicVar;  // 任何地方可访问public function __construct() {$this->privateVar = 0;$this->protectedVar = 0;$this->publicVar = 0;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hago 的 Spark on ACK 实践

作者:华相 Hago 于 2018 年 4 月上线,是欢聚集团旗下的一款多人互动社交明星产品。Hago 融合优质的匹配能力和多样化的垂类场景,提供互动游戏、多人语音、视频直播、 3D 虚拟形象互动等多种社交玩法,致力于为用户打造高效、多样、…

Centos安装vsftpd:centos配置vsftpd,ftp报200和227错误

一、centos下载安装vsftpd(root权限) 1、下载安装 yum -y install vsftpd 2、vsftpd的配置文件 /etc/vsftpd.conf 3、备份原来的配置文件 sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.backup 4、修改配置文件如下:vi /etc/vsftpd.conf …

收银管理系统怎样帮助商家很好地经营服装门店

收银管理系统对于服装门店的经营可以提供多方面的帮助,以下是一些具体的优势和功能: 1. 快速准确的收银:收银管理系统可以实现快速、准确的收银操作,通过条码扫描或手动输入商品信息,自动计算价格并生成收据。这样可以…

差生文具多之(二): perf

栈回溯和符号解析是使用 perf 的两大阻力,本文以应用程序 fio 的观测为例子,提供一些处理它们的经验法则,希望帮助大家无痛使用 perf。 前言 系统级性能优化通常包括两个阶段:性能剖析和代码优化: 性能剖析的目标是寻…

如何开发专属花店展示平台小程序?

如今,微信小程序已经成为了花店行业拓展客户资源的重要工具。通过开发一个专属花店小程序,你可以为自己的花店带来更多的曝光和客户资源。那么,如何开发一个专属花店小程序呢?接下来,我们将一步步为你详细讲解。 首先&…

STB0016导线防碰撞警示装置

适用场所: 适用于高压线,塔吊,路政,船舶,种植,塔机,航海航道等场所起警示作用。 产品特点: 光控无开关,白天不闪,昏暗环境自动闪烁,无需手动操作,省时省事; 采用红色LED作光源,亮度高&#…

0.618算法和基于Armijo准则的线搜索回退法

0.618代码如下: import math # 定义函数h(t) t^3 - 2t 1 def h(t): return t**3 - 2*t 1 # 0.618算法 def golden_section_search(a, b, epsilon): ratio 0.618 while (b - a) > epsilon: x1 b - ratio * (b - a) x2 a ratio * (b - a) h_…

【期末考试】计算机网络、网络及其计算 考试重点

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 计算机网络及其计算 期末考点 🚀数…

智能优化算法应用:基于白鲸算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于白鲸算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于白鲸算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.白鲸算法4.实验参数设定5.算法结果6.参考文献7.MA…

JavaScript原型,原型链 ? 有什么特点?

一、原型 JavaScript 常被描述为一种基于原型的语言——每个对象拥有一个原型对象 当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个…

Vue如何请求接口——axios请求

1、安装axios 在cmd或powershell打开文件后,输入下面的命令 npm install axios 可在项目框架中的package.json中查看是否: 二、引用axios import axios from axios 在需要使用的页面中引用 三、get方式使用 get请求使用params传参,本文只列举常用参数…

华为云Stack 8.X 流量模型分析(二)

二、流量模型分析相关知识 1.vNIC ​ 虚拟网络接口卡(vNIC)是基于主机物理 NIC 的虚拟网络接口。每个主机可以有多个 NIC,每个 NIC 可以是多个 vNIC 的基础。 ​ 将 vNIC 附加到虚拟机时,Red Hat Virtualization Manager 会在虚拟机之间创建多个关联的…

IPC之九:使用UNIX Domain Socket进行进程间通信的实例

socket 编程是一种用于网络通信的编程方式,在 socket 的协议族中除了常用的 AF_INET、AF_RAW、AF_NETLINK等以外,还有一个专门用于 IPC 的协议族 AF_UNIX,IPC 是 Linux 编程中一个重要的概念,常用的 IPC 方式有管道、消息队列、共…

摄影企业网站搭建的作用是什么

几乎每个成年人都有一部手机,在互联网信息时代,手机的作用不言而喻,拍照/摄像成为了不少人经常会做的事,拍一张美美的照片发到社交圈赢得赞声,或是为以后留下回忆或发给自己在意的人,但这只限于生活记叙类图…

即将来临的2024年,汽车战场再起波澜?

我们来简要概况一下11月主流车企的销量表现: 根据数据显示,11月吉利集团总销量29.32万辆,同比增长28%。这在当月国内主流车企中综合实力凌厉,可谓表现得体。而与吉利直接竞争的比亚迪,尽管数据未公布,但我们…

AI Native工程化:百度App AI互动技术实践

作者 | GodStart 导读 随着AI浪潮的兴起,越来越多的应用都在利用大模型重构业务形态,在设计和优化Prompt的过程中,我们发现整个Prompt测评和优化周期非常长,因此,我们提出了一种Prompt生成、评估与迭代的一体化解决方案…

向量投影:如何将一个向量投影到矩阵的行向量生成子空间?

向量投影:如何将一个向量投影到矩阵的行向量生成子空间? 前言 本问题是在学习Rosen梯度投影优化方法的时候遇到的问题,主要是对于正交投影矩阵(NT(NNT)-1N)的不理解,因此经过查阅资料,学习了关于向量投影的知识&…

高级人工智能之群体智能:蚁群算法

群体智能 鸟群: 鱼群: 1.基本介绍 蚁群算法(Ant Colony Optimization, ACO)是一种模拟自然界蚂蚁觅食行为的优化算法。它通常用于解决路径优化问题,如旅行商问题(TSP)。 蚁群算法的基本步骤…

【YOLOV8预测篇】使用Ultralytics YOLO进行检测、分割、姿态估计和分类实践

目录 一 安装Ultralytics 二 使用预训练的YOLOv8n检测模型 三 使用预训练的YOLOv8n-seg分割模型 四 使用预训练的YOLOv8n-pose姿态模型 五 使用预训练的YOLOv8n-cls分类模型 <

Altium Designer(AD24)新工程复用设计文件图文教程及视频演示

&#x1f3e1;《专栏目录》 目录 1&#xff0c;概述2&#xff0c;复用方法一视频演示2.1&#xff0c;创建工程2.2&#xff0c;复用设计文件 3&#xff0c;复用方法二视频演示4&#xff0c;总结 欢迎点击浏览更多高清视频演示 1&#xff0c;概述 本文简述使用AD软件复用设计文件…