java-权限修饰符

## Java中的权限修饰符

Java中的权限修饰符(Access Modifiers)用于控制类、方法和变量的访问级别。通过权限修饰符,可以在一定范围内保护类的成员,确保数据的封装和安全性。Java提供了四种主要的权限修饰符:`private`、`default`(也称为包级私有)、`protected`和`public`。每种修饰符都有不同的访问权限范围,下面将详细解释每种修饰符的使用和特点。

### 1. `private`

`private`修饰符是最严格的权限修饰符,表示该成员只能在它所在的类中访问。其他类,包括它的子类和同一个包中的其他类,均无法访问它。使用`private`修饰符可以有效地隐藏类的内部实现,保护数据的私密性。

#### 示例

```java
class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    private void displayInfo() {
        System.out.println("Name: " + name + ", Age: " + age);
    }

    public void showInfo() {
        displayInfo(); // 只能在同一个类中调用
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person("Alice", 30);
        person.showInfo(); // 通过公有方法访问私有方法
        // person.displayInfo(); // 错误,无法访问私有方法
    }
}
```

在上述代码中,`Person`类的成员变量`name`和`age`以及方法`displayInfo`都被声明为`private`,只能在`Person`类内部访问。通过`showInfo`方法,外部类可以间接访问这些私有成员。

### 2. `default`(包级私有)

`default`修饰符,也称为包级私有,是不加任何修饰符的默认访问级别。表示该成员在同一个包中的其他类可以访问,但在不同包中的类无法访问。`default`修饰符用于限制类的成员在包内的可见性,通常用于包内协作的类。

#### 示例

```java
class Person {
    String name; // 包级私有
    int age;     // 包级私有

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    void displayInfo() {
        System.out.println("Name: " + name + ", Age: " + age);
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person("Bob", 25);
        person.displayInfo(); // 同一个包中的类可以访问包级私有成员
    }
}
```

在上述代码中,`Person`类的成员变量`name`和`age`以及方法`displayInfo`都没有显式的权限修饰符,因此它们是包级私有的。同一个包中的`Main`类可以访问这些成员。

### 3. `protected`

`protected`修饰符表示该成员可以在同一个包中的类和不同包中的子类中访问。`protected`修饰符提供了包级访问权限,并允许继承关系中的子类访问父类的受保护成员。

#### 示例

```java
class Person {
    protected String name;
    protected int age;

    protected Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    protected void displayInfo() {
        System.out.println("Name: " + name + ", Age: " + age);
    }
}

class Employee extends Person {
    private String position;

    public Employee(String name, int age, String position) {
        super(name, age);
        this.position = position;
    }

    public void showEmployeeInfo() {
        displayInfo(); // 子类可以访问父类的受保护方法
        System.out.println("Position: " + position);
    }
}

public class Main {
    public static void main(String[] args) {
        Employee employee = new Employee("Charlie", 40, "Manager");
        employee.showEmployeeInfo(); // 访问受保护方法
    }
}
```

在上述代码中,`Person`类的成员变量`name`和`age`以及方法`displayInfo`被声明为`protected`,因此`Employee`类可以访问这些成员。

### 4. `public`

`public`修饰符表示该成员可以在任何地方访问,不受包或继承关系的限制。`public`修饰符提供了最大的访问权限,用于那些需要广泛访问的类和成员。

#### 示例

```java
public class Person {
    public String name;
    public int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void displayInfo() {
        System.out.println("Name: " + name + ", Age: " + age);
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person("David", 35);
        person.displayInfo(); // 访问公有方法
    }
}
```

在上述代码中,`Person`类的成员变量`name`和`age`以及方法`displayInfo`被声明为`public`,因此任何地方都可以访问这些成员。

### 5. 权限修饰符的访问级别总结

为了更好地理解各权限修饰符的访问级别,可以参考下表:

| 修饰符      | 同一个类 | 同一个包 | 不同包中的子类 | 不同包中的非子类 |
| ----------- | -------- | -------- | ------------- | --------------- |
| `private`   | 是       | 否       | 否            | 否              |
| `default`   | 是       | 是       | 否            | 否              |
| `protected` | 是       | 是       | 是            | 否              |
| `public`    | 是       | 是       | 是            | 是              |

### 6. 使用权限修饰符的最佳实践

在实际开发中,合理使用权限修饰符可以提高代码的安全性和可维护性。以下是一些最佳实践:

#### 1. 封装

优先考虑将成员变量声明为`private`,通过公共方法(如getter和setter)来访问和修改它们的值。这种方式有助于封装类的内部实现,防止外部直接修改对象的状态。

```java
class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
```

#### 2. 限制访问范围

根据需要限制成员的访问范围。不要随意将成员声明为`public`,而是根据实际需求选择合适的权限修饰符。

#### 3. 保护继承关系

使用`protected`修饰符保护需要在子类中访问的成员。这有助于维护类的继承关系,同时限制对外部类的访问。

#### 4. 避免包级私有

除非明确需要,尽量避免使用包级私有(`default`)修饰符。包级私有可能导致意外的访问权限,增加代码维护的难度。

### 7. 总结

Java中的权限修饰符提供了控制类、方法和变量访问级别的机制,确保数据的封装和安全性。通过合理使用`private`、`default`、`protected`和`public`修饰符,可以在不同的访问级别之间平衡安全性和灵活性。理解和应用权限修饰符是编写健壮、安全和可维护代码的关键。

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

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

相关文章

​​Vitis HLS 学习笔记--添加 RTL 黑盒函数

目录 1. 简介 2. 用法详解 2.1 需要的文件 2.1.1 RTL 函数签名 2.1.2 黑盒 JSON 描述文件 2.1.3 RTL IP 文件 2.2 操作步骤 3. 总结 1. 简介 Vitis HLS 工具可以将现有的 Verilog RTL IP(即硬件描述语言编写的模块)集成到 C/C HLS 项目中。通过…

专家解读 | NIST网络安全框架(3):层级配置

NIST CSF在核心部分提供了六个类别的关键功能和子功能,并围绕CSF的使用提供了层级(Tier)和配置(Profile)两种工具,使不同组织和用户更方便有效地使用CSF,本文将深入探讨CSF层级和配置的主要内容…

【PL理论】(24) C- 语言:有块的作用域 | 更新的语法 | 新的语义域 | 环境 vs. 内存

💭 写在前面:我们将再次扩展之前的C语言,让我们向这种语言引入“作用域”的概念。 目录 0x00 C- 语言:有块的作用域 0x01 C- 语言:更新的语法 0x02 新的语义域 0x03 环境 vs. 内存 0x00 C- 语言:有块的…

RDF 简介

RDF 简介 1. 引言 资源描述框架(Resource Description Framework,简称RDF)是一种用于描述网络资源的标准数据模型。它提供了一种通用的框架,用于表达关于资源的元数据,即数据的数据。RDF是语义网的核心技术之一,旨在使数据不仅能够被计算机处理,还能被计算机理解。在本…

图像去重技术:MD5哈希在自动化中的应用

目录 前言 一、MD5的介绍 二、常见的MD5哈希用途 三、hashlib库介绍 四、实际应用-图片去重 前言 MD5(Message Digest Algorithm 5)是一种广泛使用的哈希函数,它可以产生一个128位(16字节)的哈希值,通…

Golang | Leetcode Golang题解之第145题二叉树的后序遍历

题目&#xff1a; 题解&#xff1a; func reverse(a []int) {for i, n : 0, len(a); i < n/2; i {a[i], a[n-1-i] a[n-1-i], a[i]} }func postorderTraversal(root *TreeNode) (res []int) {addPath : func(node *TreeNode) {resSize : len(res)for ; node ! nil; node n…

大语言模型QA

Q:关于 Yi-9B 通过 input/output cosine 来分析模型,可能文档里没有把前提说明白。该指标确实存在你们提到的不同模型大小不可比的问题。所以我们比较的是同一个模型在不同训练阶段,以及 layer 深度相同的dense models 之间的比较。除了发现yi-6B/34B 随着训练 tokens 的增加…

11.NiO多线程优化

场景 单线程配合一个selector选择器管理多个channel上的事件。 问题 1.多核cpu,如果是单线程就会让cpu的力量被浪费。 2.单线程处理多个事件,如果某个事件耗费时间比较久,就会影响其它事件的处理。 例如:redis单线程写的,底层网络用的类似于nio和selector方式编写,所…

Polkadot <> Kusama 桥:打造无信任互操作性的开创性范例

原文&#xff1a;https://www.parity.io/blog/trustless-interoperability 作者&#xff1a;Adrian Catangiu&#xff5c;Rust 区块链核心工程师&#xff0c;Parity Technologies 编译&#xff1a;OneBlock Polkadot <> Kusama 桥是无信任互操作性的开创性范例。本文深…

TCP相关细节

1. 常用TCP参数 1.1 ReceiveBufferSize ReceiveBuffersize指定了操作系统读缓冲区的大小&#xff0c; 默认值是8192(如图5-10 所示)。在第4章的例子中,会有"假设操作系统缓冲区的长度是8" 这样的描述,可通过socket.ReceiveBufferSize 8 实现。当接收端缓冲区满了的时…

C#面:C#构造器Constructor是否可以被继承?是否可以被Override?

C#构造器&#xff08;Constructor&#xff09;不能被继承&#xff0c;也不能被重写&#xff08;Override&#xff09;。 构造器是用于创建和初始化对象的特殊方法。它在对象创建时自动调用&#xff0c;并负责初始化对象的成员变量和执行其他必要的操作。构造器的名称与类名相同…

实用软件下载:XMind 2024最新安装包及详细安装教程

​XMind不仅是一款易用且功能强大的思维导图软件&#xff0c;也是一个开源项目。XMind以构建一个社区向全球提供领先的跨平台思维导图和头脑风暴软件为目标&#xff0c;以帮助用户提升效率。XMind公司是XMind开源项目的主要代码贡献者&#xff0c;与此同时&#xff0c;我们欢迎…

Stable Diffusion本地化部署详细攻略

一、硬件要求 内存&#xff1a;至少16GB 硬盘&#xff1a;至少60GB以上的磁盘空间&#xff0c;推荐SSD固态硬盘 显卡&#xff1a;推荐NVIDIA显卡 显存&#xff1a;至少4GB Stabl Diffusion因为是在本地部署&#xff0c;对显卡的要求比较高&#xff0c;如果经济能力可以的话…

AI大模型爆发,你还不学就晚了!抓住时代机遇,快速入门指南!

AI大模型风起云涌&#xff0c;你准备好乘风破浪了吗&#xff1f; 在一个阳光明媚的午后&#xff0c;小李坐在自己的工位上&#xff0c;眼前的代码如同繁星般繁多。他是一名资深的软件工程师&#xff0c;但在最近的技术浪潮中&#xff0c;他却感到了一丝不安。他的朋友圈里&…

ubuntu20.0.4下安装PyTorch

参考文档 https://datawhalechina.github.io/thorough-pytorch/%E7%AC%AC%E4%B8%80%E7%AB%A0/1.2%20PyTorch%E7%9A%84%E5%AE%89%E8%A3%85.html 1&#xff1a;安装Anaconda 登录Anaconda | Individual Edition&#xff0c;https://www.anaconda.com/download/success &#xff…

RN6752V1 高性能AHD转MIPIDVPBT656BT601芯片方案,目前适用于车载方案居多

RN6752V1描述&#xff1a; RN6752V1是一种模拟高清晰度&#xff08;模拟高清&#xff09;视频解码器IC&#xff0c;专为汽车应用而设计。它集成了所有必要的功能块&#xff1a; AFE&#xff0c;PLL&#xff0c;解码逻辑&#xff0c;MIPI和I2C接口等&#xff0c;在一个小的5mm …

在 Python 中创建具有当前日期和时间的文件名

在 Python 中使用当前日期和时间创建文件名的一种方法是使用 datetime 模块。 要在 Python 中格式化 datetime 对象&#xff0c;我们可以使用 strftime&#xff08;&#xff09; 方法&#xff0c;使用 strftime&#xff08;&#xff09; 方法创建格式化的日期时间字符串。 示…

LLM资料大全:文本多模态大模型、垂直领域微调模型、STF数据集、训练微调部署框架、提示词工程等

前言 自ChatGPT为代表的大语言模型&#xff08;Large Language Model, LLM&#xff09;出现以后&#xff0c;由于其惊人的类通用人工智能&#xff08;AGI&#xff09;的能力&#xff0c;掀起了新一轮[自然语言处理]领域的研究和应用的浪潮。尤其是以ChatGLM、LLaMA等平民玩家都…

【ARM Cache 及 MMU 系列文章 6.5 -- 如何进行 Cache miss 统计?】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 ARM Cache Miss 统计Cache 多层架构简介Cache 未命中的类型Cache 未命中统计Cache miss 统计代码实现Cache Miss 统计意义ARM Cache Miss 统计 在ARMv8/v9架构中,缓存未命中(Cache …

深度解析服务发布策略之金丝雀发布

目录 什么是金丝雀发布&#xff08;Canary Release&#xff09; 金丝雀发布的原理 金丝雀发布的优点 金丝雀发布的注意事项 金丝雀发布的实现步骤 小结 在软件开发和运维中&#xff0c;发布新版本是一个风险较高的操作。为了降低风险&#xff0c;提高发布的稳定性和可靠性…