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

news2024/11/26 15:33:47

在不同编程语言中,控制成员(变量、方法、类等)可见性的机制不尽相同。以下是对比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 main

import (
    "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 is
    procedure Public_Procedure;
private
    procedure Private_Procedure;
end Example;

package body Example is

    procedure Public_Procedure is
    begin
        -- implementation
    end Public_Procedure;

    procedure Private_Procedure is
    begin
        -- implementation
    end Private_Procedure;

end Example;

-- 另一个文件或包使用 Example
with Example;
procedure Use_Example is
begin
    Example.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 mangling
        print(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.coloradmin.cn/o/1332378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Selenium4+Python3 - Iframe、Select控件、交互式弹出框、执行JS、Cookie操作

一、iframe操作 iframe识别: 语法: driver.switch_to.frame(‘方式’) 1、常见处理方法三种 index:下标name:id或name属性的值webelement:元素 2、通过下标进入 进入第一个iframe: driver.switch_to.…

【什么是反射机制?为什么反射慢?】

✅ 什么是反射机制?为什么反射慢? ✅典型解析✅拓展知识仓✅反射常见的应用场景✅反射和Class的关系 ✅典型解析 反射机制指的是程序在运行时能够获取自身的信息。在iava中,只要给定类的名字,那么就可以通过反射机制来获得类的所有…

C++笔试训练day_2

文章目录 选择题7. 编程题1.2. 选择题 (6)因为p2被const修饰所以p2不可以被改变,但是p2的指向可以被改变 (7)因为指针p3被const修饰,所以p3的指向不能被改变,但是*p3可以被改变 int main() {in…

spring boot集成mybatis和springsecurity实现权限控制功能

上一篇已经实现了登录认证功能,这一篇继续实现权限控制功能,文中代码只贴出来和上一篇不一样的修改的地方,完整代码可结合上一篇一起整理spring boot集成mybatis和springsecurity实现登录认证功能-CSDN博客 数据库建表 权限控制的意思就是根…

前端常用的工具网站

前端常用的工具网站🔖 文章目录 前端常用的工具网站🔖1. 图片在线压缩2. iconfont--矢量图标3. JSON在线格式化4. EMOJIALL--表情符号5. removebg--去除图片背景6. FREE API--免费API接口7. Lorem picsum --随机图片8.UU在线工具 -- 聚合工具 1. 图片在线…

Windows系统安装 ffmpeg

下载及解压 ffmpeg官方下载地址:https://ffmpeg.org/download.html 下载好后将其解压至你想保存的位置中。 环境变量设置 打开Windows设置,在搜索框输入:系统高级设置。 新建环境变量,并输入bin目录具体位置。 安装检查 按住 w…

图形处理工具:Photoshop Elements 2020 mac介绍说明

Photoshop Elements 2020 mac简称ps elements 2020,是一款图形处理工具。ps elements 2020 mac可以帮助您自动生成照片和视频作品的功能,采用Sensei AI技术可进行图像组织、编辑和创建等。Photoshop Elements 2020 可以帮助您轻松整理照片和视频&#xf…

【Linux】定时任务

定时任务常用crontab来定期执行程序。 crontab 基本语法 crontab [-u user] -l # 列出用户cron任务 crontab [-u user] -e # 编辑用户cron任务 crontab [-u user] -r # 移除用户cron任务cron 表达式 # 分 时 日 月 周 执行命令 minute hour day month week command # 示例…

Simulink元件

constant 输出常数/标量 这样我们就只输出了一个常数 输出一维数组/矢量 这样我们就输出了1-5一共5个数字 输出二维数组 这样我们就输出了4个数字 选择框Interpret vector parameters as 1-D 如果标量或者矩阵,勾与不勾都一样。 如果是向量,勾选则表…

Keil中文报错提示为: [-Winvalid-source-encoding]问题解决

错误提示&#xff1a; ../User/main.c(67): warning: illegal character encoding in string literal [-Winvalid-source-encoding]67 | printf("全<B2><BF><B4><AB><CA><E4><CD><EA><B3><C9…

java旅游攻略管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web旅游攻略管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

2023 第六届安洵杯 writeup

CRYPTO 010101 漏洞点在 p1[random.choice([i for i, c in enumerate(p1) if c 1])] 0p2[random.choice([i for i, c in enumerate(p1) if c 0])] 1 p1只是随机的把1的位置转一个变成0&#xff0c;p2把0的位置随机转一个到1&#xff0c;直接逆回去即可 charonroot:~/D…

Unity使用Rider作为默认编辑器

01.Edit -> Preferences 02.Externel Tools -> Open by file extension 如果界面选项有Rider直接选择&#xff0c;如果没有选择Browse) 03.选择rider64.exe 04.成功关联

Qt的简单游戏实现提供完整代码

文章目录 1 项目简介2 项目基本配置2.1 创建项目2.2 添加资源 3 主场景3.1 设置游戏主场景配置3.2 设置背景图片3.3 创建开始按钮3.4 开始按钮跳跃特效实现3.5 创建选择关卡场景3.6 点击开始按钮进入选择关卡场景 4 选择关卡场景4.1场景基本设置4.2 背景设置4.3 创建返回按钮4.…

C++设计模式 #6 桥模式(Bridge)

动机 由于某些类型的固有的实现逻辑&#xff0c;使得它们具有两个变化的维度&#xff0c;乃至多个变化的维度。 如何应对这种“多维度的变化”&#xff1f;如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化&#xff0c;而不引入额外的复杂度 举个栗子 我们…

JavaOOP篇----第十五篇

系列文章目录 文章目录 系列文章目录前言一、有没有可能两个不相等的对象有相同的hashcode二、拷贝和浅拷贝的区别是什么?三、static都有哪些用法?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通…

基于SSM的双减后初小教育课外学习生活活动平台的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

【零基础入门Docker】如何构建Web服务Dockerfile?

✍面向读者&#xff1a;所有人 ✍所属专栏&#xff1a;零基础入门Docker专栏https://blog.csdn.net/arthas777/category_12455882.html 目录 步骤1&#xff1a;第一步是构建我们的Docker文件&#xff0c;您可以使用vim编辑器。 步骤2&#xff1a;下一步是使用docker build命令…

学习stm32 模电数电需要学哪些?

学习stm32 模电数电需要学哪些&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「 stm32的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&…

帧内预测器的设计:提升视频编码效率的关键技术

随着互联网的迅猛发展&#xff0c;视频应用成为人们日常生活中不可或缺的一部分。然而&#xff0c;视频文件的传输和存储所需要的带宽和空间成本巨大。为了解决这个问题&#xff0c;视频编码技术应运而生。在视频编码中&#xff0c;帧内预测器是一项关键技术&#xff0c;通过利…