当前位置: 首页 > news >正文

【面向对象】对比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;}
}

相关文章:

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

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

力扣(leetcode)第26题删除有序数组中的重复项(Python)

26.删除有序数组的重复项 题目链接:26.删除有序数组的重复项 给你一个非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 …...

【内存泄漏】内存泄漏及常见的内存泄漏检测工具介绍

内存泄漏介绍 什么是内存泄漏 内存泄漏是指程序分配了一块内存(通常是动态分配的堆内存),但在不再需要这块内存的情况下未将其释放。内存泄漏会导致程序浪费系统内存资源,持续的内存泄漏还导致系统内存的逐渐耗尽,最…...

FPGA-ZYNQ-7000 SoC在嵌入式系统中的优势

FPGA-ZYNQ-7000 SoC在嵌入式系统中的优势 本章节主要参考书籍《Xilinx Zynq-7000 嵌入式系统设计与实现 基于ARM Cortex-A9双核处理器和Vivado的设计方法 (何宾,张艳辉编著)》 本章节主要讲述FPGA-ZYNQ-7000 SoC在嵌入式系统中的优势,学习笔…...

如何在Vue3中实现无缝热重载:提升你的开发效率

Vue3中的热重载(Hot Module Replacement,简称HMR)是一种开发时的功能,它允许开发者在不刷新整个页面的情况下,实时替换、添加或删除模块。这意味着当你对Vue组件进行修改并保存时,这些更改会立即反映在浏览…...

盒子 Box

UVa1587 思路&#xff1a; 1.输入每个面的长宽并将每个面较长的一边放在前面 2.判断是否存在三对面分别相等 3.判断是否存在三组四棱相等 #include <stdio.h> #include <stdlib.h> #define maxn 100int cmp(const void* e1, const void* e2) {return (int)(*(d…...

uni-app附件下载预览 并解决打开附件时黑屏

// 预览附件perviewFile(file) {console.log(点击附件, file)var strfile.previewUrlvar filTypestr.split(.)console.log(filType,filType)uni.downloadFile({url: success: function(res) {console.log(打开文档成功, res);if (res.statusCode 200) {uni.saveFile({tempFile…...

卸载了Visual Studio后,在vscode中执行npm i或npm i --force时报错,该怎么解决?

卸载了Visual Studio后&#xff0c;在vscode中执行npm i或npm i --force时报错,该怎么解决&#xff1f; 报错内容&#xff1a;原因解决办法 报错内容&#xff1a; npm ERR! code 1 npm ERR! path E:\VScode\codeDate\yugan\node_modules\node-sass npm ERR! command failed np…...

渗透测试 | 信息收集常用方法合集

目录 一、关于域名 1.子域名收集 a.搜索引擎查找 b.在线查询 c.工具 d.SSL/TLS证书查询 2.端口型站点收集 3.目录文件扫描 a.目录扫描工具 b.github搜索 c.google搜索 d.在线网站 e.文件接口工具 4.旁站和C段 a.旁站查询 b.C段查询 5.网站技术架构信息 a.基础…...

使用 ElementUI 组件构建无边框 Window 桌面应用(WinForm/WPF)

生活不可能像你想象得那么好,但也不会像你想象得那么糟。 我觉得人的脆弱和坚强都超乎自己的想象。 有时,我可能脆弱得一句话就泪流满面;有时,也发现自己咬着牙走了很长的路。 ——莫泊桑 《一生》 一、技术栈 Vite + Vue3 + TS + ElementUI(plus) + .NET Framework 4.7.2…...

JavaScript中数组的方法和函数作用域问题

1 -函数作用域问题-: 函数的外层作用域&#xff0c;在函数创建时就已确定&#xff0c;和函数的调用位置无关 var name 嘿嘿;// 函数的外层作用域&#xff0c;在函数创建时就已确定&#xff0c;和函数的调用位置无关// JS中的作用域被称为 词法作用域function fn() {console.…...

nodejs设置x-xss-protection解决xss问题

在Node.js中设置X-XSS-Protection可以通过使用helmet库来完成。 首先&#xff0c;确保已经安装了helmet库。如果没有安装&#xff0c;可以运行以下命令进行安装&#xff1a; npm install helmet --save 然后&#xff0c;在你的Node.js应用程序中引入并配置helmet库&#xff…...

C/C++不同整数类型的区别

在C/C中涉及的整数相关的类型大致有如下几种&#xff1a; char、unsigned charshort、unsigned shortint、unsigned intlong、unsigned longlong long、unsigned long longint8_t、uint8_tint32_t、uint32_tint64_t、uint64_tDWORDDWORD32、DWORD64size_t、ssize_tSIZE_T、SSI…...

如何理解JDK、JRE、JVM区别与联系

摘要&#xff1a;JDK是 Java 语言的软件开发工具包(SDK)。在JDK的安装目录下有一个jre目录&#xff0c;里面有两个文件夹bin和lib&#xff0c;在这里可以认为bin里的就是jvm&#xff0c;lib中则是jvm工作所需要的类库&#xff0c;而jvm和 lib合起来就称为jre。 一、JDK JDK(Ja…...

用友GRP-U8 SmartUpload01 文件上传漏洞

漏洞描述 用友GRP-U8行政事业内控管理软件是一款专门针对行政事业单位开发的内部控制管理系统&#xff0c;旨在提高内部控制的效率和准确性。该软件/u8qx/SmartUpload01.jsp接口存在文件上传漏洞&#xff0c;未经授权的攻击者可通过此漏洞上传恶意后门文件&#xff0c;从而获取…...

react 路由v6

这里是区别&#xff1a;V5 vs V6 这里是官网&#xff1a;可以查看更多高级属性 一、基本使用&#xff1a; 1、配置文件 src/routes/index import React from "react";const Home React.lazy(() > import("../Pages/Home")); const About React.laz…...

rpc【通义】rpc原理【gpt】

一 rpc RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种编程技术&#xff0c;它允许在分布式系统中的一个程序像调用本地函数一样调用另一个程序&#xff08;位于不同的机器或进程中&#xff09;的函数或方法。RPC的主要目标是隐藏网络通信的…...

Leetcode 2973. Find Number of Coins to Place in Tree Nodes

Leetcode 2973. Find Number of Coins to Place in Tree Nodes 1. 解题思路2. 代码实现 题目链接&#xff1a;2973. Find Number of Coins to Place in Tree Nodes 1. 解题思路 这道题思路上其实挺简单的&#xff0c;就是一个遍历的思路&#xff0c;找到每一个点对应的子树当…...

如何调动销售人员使用CRM的积极性?

CRM系统在销售人员眼中是流程监管工具也是单调枯燥的操作空间&#xff0c;如何让销售爱上CRM系统&#xff1f;1.让CRM简化销售工作&#xff1b;2.智能提醒销售各项事务&#xff1b;3.让CRM界面更加丰富多彩&#xff0c;通过这些方法帮助销售经理轻松管理团队&#xff0c;销售对…...

数值分析期末复习

第一章 科学计算 误差 解题步骤 x : 真实值 x:真实值 x:真实值 x ∗ : 近似值 x^*:近似值 x∗:近似值 先求绝对误差 e ∗ e^* e∗: x − x ∗ x - x^* x−x∗ 绝对误差限是 ∣ x − x ∗ ∣ ≤ ε |x - x^{*}| \le \varepsilon ∣x−x∗∣≤ε 求相对误差限: ∣ x − x ∗…...

装机解惑:Bios中的Secure Boot与CSM,为何相爱相杀?

1. Secure Boot与CSM&#xff1a;现代PC的引导之争 刚装好的新电脑突然黑屏&#xff0c;这种经历估计不少DIY玩家都遇到过。上周我就帮朋友处理了这么个案例&#xff1a;他为了省钱继续用老显卡GTX650ti&#xff0c;结果在新配的13代酷睿主机上死活点不亮屏幕。这背后其实是UEF…...

大疆C板实战:基于BMI088与Mahony算法的实时姿态解算实现

1. 从零开始搭建姿态解算系统 第一次接触大疆C板的时候&#xff0c;我被它精致的做工和丰富的接口惊艳到了。这块开发板简直就是为机器人开发者量身定做的&#xff0c;特别是内置的BMI088惯性测量单元(IMU)&#xff0c;让我们不用再为传感器选型和电路设计发愁。不过说实话&…...

告别复制粘贴!用Keil MDK 5.27为GD32F450搭建专属工程模板(附完整文件结构)

打造高效嵌入式开发工作流&#xff1a;基于Keil MDK 5.27的GD32F450工程模板设计指南 在嵌入式开发领域&#xff0c;重复劳动是效率的最大敌人。每次启动新项目时&#xff0c;开发者往往需要花费大量时间在基础环境搭建、文件结构组织和编译配置上。这种低效的工作模式不仅消耗…...

大语言模型行为与知识探测:从黑箱测试到认知图谱构建

1. 项目概述&#xff1a;为你的大模型装上“说明书”如果你正在使用或开发大语言模型&#xff0c;无论是开源的Llama、ChatGLM&#xff0c;还是闭源的商业API&#xff0c;一个绕不开的痛点就是&#xff1a;这模型到底“懂”什么&#xff1f;它的知识边界在哪里&#xff1f;面对…...

tchMaterial-parser:5分钟快速上手,轻松获取国家中小学智慧教育平台电子课本的完整指南

tchMaterial-parser&#xff1a;5分钟快速上手&#xff0c;轻松获取国家中小学智慧教育平台电子课本的完整指南 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具&#xff0c;帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载&#x…...

避开STM32G4比较器的那些‘坑’:LOCK机制、EXTI连接与GPIO配置详解

STM32G4比较器开发实战&#xff1a;LOCK机制、EXTI映射与GPIO配置的深度解析 当你在深夜调试STM32G4的比较器模块时&#xff0c;突然发现中断死活不触发&#xff0c;或者LOCK寄存器配置后无法修改参数&#xff0c;这种挫败感我深有体会。本文将带你直击STM32G4比较器开发中最容…...

Cadence Allegro 17.4 实战:阻抗控制与高速PCB设计的关键几步(以50欧姆匹配为例)

Cadence Allegro 17.4 实战&#xff1a;阻抗控制与高速PCB设计的关键几步&#xff08;以50欧姆匹配为例&#xff09; 在高速PCB设计中&#xff0c;阻抗控制是确保信号完整性的核心环节。当信号频率超过100MHz或上升时间短于1ns时&#xff0c;传输线效应开始显现&#xff0c;此时…...

Vivado工程文件太大?三步教你用Tcl脚本实现源码“瘦身”与备份(附完整命令)

Vivado工程瘦身实战&#xff1a;Tcl脚本驱动的源码管理与协作优化 在FPGA开发领域&#xff0c;Vivado工程文件的体积膨胀问题一直是开发者面临的痛点。一个中等规模的项目经过几次综合与实现后&#xff0c;工程目录轻松突破数百MB并不罕见。这不仅占用宝贵的存储空间&#xff…...

手把手教你用Zynq-7100 FPGA实现100Mbps OOK信号定时同步(含完整Verilog代码)

基于Zynq-7100的OOK信号定时同步实战&#xff1a;从算法到FPGA实现全解析 在无线通信系统中&#xff0c;定时同步是数字接收机设计中最关键的环节之一。当我们需要在Xilinx Zynq-7100 FPGA平台上实现100Mbps OOK信号的接收处理时&#xff0c;面临的最大挑战是如何在仅有50MHz外…...

系统提示词工程:构建稳定可控的大语言模型应用实践

1. 项目概述与核心价值 最近在GitHub上看到一个挺有意思的项目&#xff0c;叫 edoardoavenia/chatgpt-system-prompts 。乍一看&#xff0c;这似乎又是一个收集ChatGPT提示词的仓库&#xff0c;但当你真正点进去&#xff0c;花点时间研究一下它的结构和内容&#xff0c;你会发…...