# Java 中的访问修饰符
> 原文: [https://javabeginnerstutorial.com/core-java-tutorial/access-modifier-in-java/](https://javabeginnerstutorial.com/core-java-tutorial/access-modifier-in-java/)
Java 中的访问修饰符可帮助您设置所需的类,变量和方法的访问级别。
有三个访问修饰符。 不包括默认访问修饰符。 默认值为访问控制,当未指定任何访问修饰符时将设置访问控制。
## 访问控制
* `public`
* `private`
* `protected`
* 默认
访问修饰符(*某些或全部*)可以应用于*类,变量,方法*。
## 类的访问修饰符
Java 中的类只能使用`public`和默认访问修饰符。
### `public`
设置为`public`时,java 世界中所有可用的类都可以访问给定的类。
### 默认
当设置为默认值时,给定的类将可供同一包中定义的类访问。
## Java 类的访问修饰符表
| **可见性** | **公开访问修饰符** | **默认访问修饰符** |
| --- | --- | --- |
| **位于同一包中** | Yes | Yes |
| **来自同一个包** | Yes | NO |
## 实例和静态变量的访问修饰符
变量适用于所有下面提到的修饰符。
* `public`
* `private`
* `protected`
* 默认
> 在检查在该类内部定义的变量的可见性之前,应检查该类的可见性。
>
> 如果该类是可见的,则在该类内部定义的变量将是可见的。
>
> 如果看不到类,则即使将其设置为`public`,也将无法访问任何变量。
### 默认
如果将变量设置为默认值,则同一包中定义的类将可以访问该变量。 在同一包中的类中定义的任何方法都可以访问变量或**继承**或**直接访问**。
### `public`
如果将变量设置为公开变量,则可以从 Java 世界中可用的任何类中进行访问。 任何类中的任何方法都可以访问给定变量或**继承**或**直接访问**。
### `protected`
如果将变量在类内设置为**受保护的**,则只能通过**继承**从相同或不同包中定义的子类中对其进行访问。
> 保护和默认之间的唯一区别是受保护的访问修饰符遵守**类-子类关系**,而默认则不。
### `private`
只能从定义变量的类内部访问定义的变量`private`。 此类变量不能从已定义的类外部访问,甚至不能在其子类中访问。
## Java 变量的访问修饰符表
| **可见性** | **公共访问修饰符** | **私有访问修饰符** | **受保护的访问修饰符** | **默认访问修饰符** |
| --- | --- | --- | --- | --- |
| **在同一个类中** | Yes | Yes | Yes | Yes |
| **来自同一包装中的任何类** | Yes | No | Yes | Yes |
| **来自同一包中的任何子类** | Yes | No | Yes | Yes |
| **来自不同包的任何子类** | Yes | No | Yes(**仅通过继承**) | No |
| **来自不同包装中的任何非子类** | Yes | No | No | No |
## 方法的访问修饰符
方法适用于以下所有修饰符。
### 默认
当“方法”设置为默认值时,同一包中定义的类将可以访问该方法。 在同一包中定义的任何类中的任何方法都可以访问给定的方法或**继承**或**直接访问**。
### `public`
将方法设置为`public`时,可以从 Java 世界中可用的任何类中访问它。 任何类中的任何方法都可以访问或**继承**或**直接访问**的给定方法,具体取决于类级别的访问。
`protected`
如果将方法设置为在类内部进行保护,则可以从在相同或不同包中定义的子类访问该方法。
> 受保护的访问权限和默认访问权限之间的唯一区别是受保护的访问修饰符遵守**的类-子类关系**,而默认的则不这样做。
`private`
只能从定义其的类内部访问定义为私有的方法。 此类方法无法从已定义的类外部访问,甚至不能从其子类访问。
## Java 方法的访问修饰符表
| **可见性** | **公共访问修饰符** | **私有访问修饰符** | **受保护访问修饰符** | **默认访问修饰符** |
| --- | --- | --- | --- | --- |
| **相同类中** | Yes | Yes | Yes | Yes |
| **来自同一包中的任何类** | Yes | No | Yes | Yes |
| **来自同一包中的任何子类** | Yes | No | Yes | Yes |
| **来自不同包的任何子类** | Yes | No | Yes(**仅通过继承**) | No |
| **来自不同包装中的任何非子类** | Yes | No | No | No |
## 局部变量的访问修饰符
*无法将*访问修饰符应用于局部变量。 只能将`final`应用于局部变量,该局部变量是[非访问修饰符](https://javabeginnerstutorial.com/core-java-tutorial/non-access-modifiers-in-java/ "Non Access Modifiers in Java")。
## 继承或直接访问之间的区别
下面说明了继承和直接访问之间的区别。
超类
```java
package com.jbt;
public class FirstClass {
public int i;
protected int j;
private int k;
int l;
}
```
同一包中的子类
```java
package com.jbt;
class SecondClass extends FirstClass {
void method() {
System.out.println(i);
System.out.println(j); // Respect the parent child relationship irrespective of package
System.out.println(k); // Compilation Error
System.out.println(l); // Accessible as it is in same package
FirstClass cls = new FirstClass();
System.out.println(cls.i);
System.out.println(cls.j);
System.out.println(cls.l);
// Private variable will not be accessible here also.
System.out.println(cls.k); // Compilation error
}
}
```
不同包中的子类
```java
package com.jbt.newpackage;
import com.jbt.FirstClass;
class SecondClass extends FirstClass {
void method() {
// Access through inheritance
System.out.println(i);
System.out.println(j); // Respect the parent child relationship irrespective of package
System.out.println(k); // Compilation error - private variable
System.out.println(l); // Compilation Error - not accessible as it is in diff package
FirstClass cls = new FirstClass();
System.out.println(cls.i); // Accessible because it is public
System.out.println(cls.j); // Compilation error
// Private variable will not be accessible here also.
System.out.println(cls.k); // Compilation error
System.out.println(cls.l); // Compilation error
}
}
```
### 备忘单
* `public`,`private`,`protected`是 3 种访问修饰符
* Java 有 4 个访问级别。 **公开,私有,受保护 & 默认**。
* 一个类只能具有公开和默认访问级别。
* 方法和实例变量(**非本地**)可以使用所有 4 个访问级别。
* 如果某个类对其他类不可见,则即使该成员的访问级别是公开的,也没有访问该类成员的问题(**重要**)。
* 在成员可见之前,应检查类可见性。
* 如果超类具有公开成员,则子类将继承它,即使它在其他包中也是如此。
* `this`始终引用当前正在执行的对象。
* 其他成员甚至可以从其他包中访问公开成员。
* 只能通过同一类中的代码访问私有成员。
* 默认成员对包外部的子类不可见。
* 即使在不同的包中,受保护的成员也可以被子类看到。
* *受保护*与*默认*之间的不同之处在于,默认仅在包之外的子类的情况下才会显示。
* 局部变量*不能*具有*访问修饰符*。
* 局部变量只能具有可以应用的最终非访问修饰符。
<https://www.youtube.com/embed/WZRTwkCOYBQ?feature=oembed>
- JavaBeginnersTutorial 中文系列教程
- Java 教程
- Java 教程 – 入门
- Java 的历史
- Java 基础知识:Java 入门
- jdk vs jre vs jvm
- public static void main(string args[])说明
- 面向初学者的 Java 类和对象教程
- Java 构造器
- 使用 Eclipse 编写 Hello World 程序
- 执行顺序
- Java 中的访问修饰符
- Java 中的非访问修饰符
- Java 中的数据类型
- Java 中的算术运算符
- Java 语句初学者教程
- 用 Java 创建对象的不同方法
- 内部类
- 字符串构建器
- Java 字符串教程
- Java 教程 – 变量
- Java 中的变量
- Java 中的局部变量
- Java 中的实例变量
- Java 引用变量
- 变量遮盖
- Java 教程 – 循环
- Java for循环
- Java 教程 – 异常
- Java 异常教程
- 异常处理 – try-with-resources语句
- Java 异常处理 – try catch块
- Java 教程 – OOPS 概念
- Java 重载
- Java 方法覆盖
- Java 接口
- 继承
- Java 教程 – 关键字
- Java 中的this关键字
- Java static关键字
- Java 教程 – 集合
- Java 数组教程
- Java 集合
- Java 集合迭代器
- Java Hashmap教程
- 链表
- Java 初学者List集合教程
- Java 初学者的Map集合教程
- Java 初学者的Set教程
- Java 初学者的SortedSet集合教程
- Java 初学者SortedMap集合教程
- Java 教程 – 序列化
- Java 序列化概念和示例
- Java 序列化概念和示例第二部分
- Java 瞬态与静态变量
- serialVersionUID的用途是什么
- Java 教程 – 枚举
- Java 枚举(enum)
- Java 枚举示例
- 核心 Java 教程 – 线程
- Java 线程教程
- Java 8 功能
- Java Lambda:初学者指南
- Lambda 表达式简介
- Java 8 Lambda 列表foreach
- Java 8 Lambda 映射foreach
- Java 9
- Java 9 功能
- Java 10
- Java 10 独特功能
- 核心 Java 教程 – 高级主题
- Java 虚拟机基础
- Java 类加载器
- Java 开发人员必须知道..
- Selenium 教程
- 1 什么是 Selenium?
- 2 为什么要进行自动化测试?
- 3 Selenium 的历史
- 4 Selenium 工具套件
- 5 Selenium 工具支持的浏览器和平台
- 6 Selenium 工具:争霸
- 7A Selenium IDE – 简介,优点和局限性
- 7B Selenium IDE – Selenium IDE 和 Firebug 安装
- 7C Selenium IDE – 突破表面:初探
- 7D Selenium IDE – 了解您的 IDE 功能
- 7E Selenium IDE – 了解您的 IDE 功能(续)。
- 7F Selenium IDE – 命令,目标和值
- 7G Selenium IDE – 记录和运行测试用例
- 7H Selenium IDE – Selenium 命令一览
- 7I Selenium IDE – 设置超时,断点,起点
- 7J Selenium IDE – 调试
- 7K Selenium IDE – 定位元素(按 ID,名称,链接文本)
- 7L Selenium IDE – 定位元素(续)
- 7M Selenium IDE – 断言和验证
- 7N Selenium IDE – 利用 Firebug 的优势
- 7O Selenium IDE – 以所需的语言导出测试用例
- 7P Selenium IDE – 其他功能
- 7Q Selenium IDE – 快速浏览插件
- 7Q Selenium IDE – 暂停和反射
- 8 给新手的惊喜
- 9A WebDriver – 架构及其工作方式
- 9B WebDriver – 在 Eclipse 中设置
- 9C WebDriver – 启动 Firefox 的第一个测试脚本
- 9D WebDriver – 执行测试
- 9E WebDriver – 用于启动其他浏览器的代码示例
- 9F WebDriver – JUnit 环境设置
- 9G WebDriver – 在 JUnit4 中运行 WebDriver 测试
- 9H WebDriver – 隐式等待
- 9I WebDriver – 显式等待
- 9J WebDriver – 定位元素:第 1 部分(按 ID,名称,标签名称)
- 9K WebDriver – 定位元素:第 2 部分(按className,linkText,partialLinkText)
- 9L WebDriver – 定位元素:第 3a 部分(按cssSelector定位)
- 9M WebDriver – 定位元素:第 3b 部分(cssSelector续)
- 9N WebDriver – 定位元素:第 4a 部分(通过 xpath)
- 9O WebDriver – 定位元素:第 4b 部分(XPath 续)
- 9P WebDriver – 节省时间的捷径:定位器验证
- 9Q WebDriver – 处理验证码
- 9R WebDriver – 断言和验证
- 9S WebDriver – 处理文本框和图像
- 9T WebDriver – 处理单选按钮和复选框
- 9U WebDriver – 通过两种方式选择项目(下拉菜单和多项选择)
- 9V WebDriver – 以两种方式处理表
- 9W WebDriver – 遍历表元素
- 9X WebDriver – 处理警报/弹出框
- 9Y WebDriver – 处理多个窗口
- 9Z WebDriver – 最大化窗口
- 9AA WebDriver – 执行 JavaScript 代码
- 9AB WebDriver – 使用动作类
- 9AC WebDriver – 无法轻松定位元素? 继续阅读...
- 10A 高级 WebDriver – 使用 Apache ANT
- 10B 高级 WebDriver – 生成 JUnit 报告
- 10C 高级 WebDriver – JUnit 报表自定义
- 10D 高级 WebDriver – JUnit 报告自定义续
- 10E 高级 WebDriver – 生成 PDF 报告
- 10F 高级 WebDriver – 截屏
- 10G 高级 WebDriver – 将屏幕截图保存到 Word 文档
- 10H 高级 WebDriver – 发送带有附件的电子邮件
- 10I 高级 WebDriver – 使用属性文件
- 10J 高级 WebDriver – 使用 POI 从 excel 读取数据
- 10K 高级 WebDriver – 使用 Log4j 第 1 部分
- 10L 高级 WebDriver – 使用 Log4j 第 2 部分
- 10M 高级 WebDriver – 以无头模式运行测试
- Vue 教程
- 1 使用 Vue.js 的 Hello World
- 2 模板语法和反应式的初探
- 3 Vue 指令简介
- 4 Vue Devtools 设置
- 5 数据绑定第 1 部分(文本,原始 HTML,JavaScript 表达式)
- 6 数据绑定第 2 部分(属性)
- 7 条件渲染第 1 部分(v-if,v-else,v-else-if)
- 8 条件渲染第 2 部分(v-if和v-show)
- 9 渲染列表第 1 部分(遍历数组)
- 10 渲染列表第 2 部分(遍历对象)
- 11 监听 DOM 事件和事件修饰符
- 12 监听键盘和鼠标事件
- 13 让我们使用简写
- 14 使用v-model进行双向数据绑定
- 15 表单输入绑定
- 18 类绑定
- Python 教程
- Python 3 简介
- Python 基础知识 - 又称 Hello World 以及如何实现
- 如何在 Windows 中安装 python
- 适用于 Windows,Mac,Linux 的 Python 设置
- Python 数字和字符串
- Python 列表
- Python 集
- Python 字典
- Python 条件语句
- Python 循环
- Python 函数
- 面向对象编程(OOP)
- Python 中的面向对象编程
- Python 3 中的异常处理
- Python 3:猜数字
- Python 3:猜数字 – 回顾
- Python 生成器
- Hibernate 教程
- Hibernate 框架基础
- Hibernate 4 入门教程
- Hibernate 4 注解配置
- Hibernate 4 的实体关系
- Hibernate 4 中的实体继承模型
- Hibernate 4 查询语言
- Hibernate 4 数据库配置
- Hibernate 4 批处理
- Hibernate 4 缓存
- Hibernate 4 审计
- Hibernate 4 的并发控制
- Hibernate 4 的多租户
- Hibernate 4 连接池
- Hibernate 自举