public,private,protected,以及不写时的区别

本文详细解析了类中成员变量和方法的四种访问权限:public、private、protected和default(friendly),包括它们在不同场景下的可见范围及应用场景,帮助开发者更好地理解和运用这些权限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作用域publicprivateprotected,以及不写时的区别

这四个作用域的可见范围如下表所示。


说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly不使用关键字默认为包内使用。


作用域    当前类 同一package 子孙类 其他package 

public    √     √          √       √ 

protected  √     √        √      × 

friendly   √     √          ×      × 

private    √     ×          ×      × 

备注:只要记住了有4种访问权限,4个访问范围,然后将全选和范围在水平和垂直方向上分别按排从小到大或从大到小的顺序排列,就很容易画出上面的图了。


例子:应用场景

1、public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用,在程序的任何其它地方访问。

2、private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可以使用。和public相反,加上这个修饰的属性和方法,只允许在自己本身这个类里访问,程序的任何其它地方都不能访问 

3、protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。受保护的,位于public和private中间,加上这个修饰的属性和方法,只能在子类(extends)和同包下的程序访问,别的的地方不能访问。

4.default(默认):同一包中的类可以访问,声明时没有加修饰符,认为是friendly。

### C++ Java 中 `public`、`private`、`protected` 及默认作用域的区别 #### 1. **C++ 的访问控制** 在 C++ 中,类的成员可以具有四种同的访问级别:`public`(公共)、`private`(私有)、`protected`(受保护),以及默认的作用域。 - **`public`**: 当前类及其派生类都可以访问该成员,外部程序也可以通过对象直接访问这些成员[^1]。 - **`private`**: 这些成员仅限于当前类内部访问,无法被任何其他类或函数访问,即使是派生类也允许访问其基类中的私有成员[^2]。 - **`protected`**: 它类似于 `private`,但是它允许可由派生类访问。因此,在继承关系中,派生类能够访问基类的 `protected` 成员,而外部代码仍然无法访问它们[^3]。 - **默认作用域 (无指定)**: 如果未显式声明访问修饰符,则对于结构体 (`struct`) 默认为 `public`,而对于类 (`class`) 则默认为 `private`。 以下是示例代码展示同访问级别的行为: ```cpp #include <iostream> using namespace std; class Base { public: int pub; // Public member private: int priv; // Private member protected: int prot; // Protected member }; int main() { Base b; b.pub = 10; // Allowed, as it is public. // b.priv = 20; // Error: 'Base::priv' is not accessible. // b.prot = 30; // Error: 'Base::prot' is inaccessible. cout << "Public Member Value: " << b.pub << endl; } ``` --- #### 2. **Java 的访问控制** Java 提供了类似的四个访问级别来定义类成员的可见性可访问范围。 - **`public`**: 所有的类包都能访问这个成员。这是最开放的一种访问权限[^4]。 - **`private`**: 仅有同一个类内的方法能访问此成员,即使是在同一包下的其他类也能访问[^5]。 - **`protected`**: 同一包下或者子类可以访问此类成员。如果在同一包内,则只有当它是某个类的子类才能访问[^6]。 - **默认作用域 (无指定)**: 若没有使用上述三个关键词之一进行限定,默认情况下只允许同包内的类访问该成员[^7]。 下面是一个简单的例子演示这几种情况: ```java package com.example.accessmodifiers; public class AccessModifiersExample { public String publicField = "This is a public field."; private String privateField = "This is a private field."; protected String protectedField = "This is a protected field."; String defaultField = "This has package-private access."; } // Another Class within the same Package can use all fields except private one directly. // A subclass outside this package will have limited access to only protected and public members. ``` --- #### 对比表 | 访问修饰符 | 自身类 | 同一包内其它类 | 子类(同包) | 非子类(同包) | |------------|--------|----------------|--------------|----------------| | public | 是 | 是 | 是 | 是 | | protected | 是 | 是 | 是 | 否 | | no modifier| 是 | 是 | 否 | 否 | | private | 是 | 否 | 否 | 否 | --- ### 总结 无论是 C++ 或者 Java ,都提供了多种方式去管理数据隐藏与封装原则的应用程度。尽管两者语法上有些差异,但核心概念基本一致——即如何合理运用这些关键字实现良好的面向对象设计模式。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值