Java权限修饰符深度解析
Java权限修饰符深度解析与最佳实践
一、权限修饰符总览
Java提供四种访问控制修饰符,按访问范围从宽到窄排序如下:
| 修饰符 | 类内部 | 同包类 | 不同包子类 | 全局范围 |
|---|---|---|---|---|
public | ✔️ | ✔️ | ✔️ | ✔️ |
protected | ✔️ | ✔️ | ✔️ | ❌ |
| 默认(无) | ✔️ | ✔️ | ❌ | ❌ |
private | ✔️ | ❌ | ❌ | ❌ |
二、各修饰符详解
1. public(全局可见)
访问范围:所有类均可访问
使用场景:
- API接口方法
- 工具类静态方法
- 常量声明
示例:
public class DataParser {public static final String DATE_FORMAT = "yyyy-MM-dd";public void parseData(String input) {// 核心解析逻辑}
}
2. protected(继承可见)
访问范围:
- 同包类
- 不同包的子类(通过继承访问)
使用场景:
- 模板方法模式中的可扩展方法
- 需要子类重写的核心方法
示例:
public abstract class BaseDao {protected void validateEntity(Object entity) {// 公共校验逻辑}
}// 不同包的子类
public class UserDao extends BaseDao {@Overrideprotected void validateEntity(Object entity) {super.validateEntity(entity);// 扩展校验逻辑}
}
3. 默认/包级私有(Package-Private)
访问范围:仅同包类可见
使用场景:
- 模块内部工具方法
- 实现类之间协作方法
- 不宜暴露的内部组件
示例:
class DatabaseConfig { // 默认修饰符类static final String DB_URL = "jdbc:mysql://localhost:3306/mydb";void loadDriver() { // 默认修饰符方法// 驱动加载逻辑}
}
4. private(类内封装)
访问范围:仅本类可见
使用场景:
- 内部实现细节
- 辅助方法
- 敏感数据字段
示例:
public class PaymentService {private String apiKey = "SECRET_KEY";private boolean validateSignature(String sign) {// 签名校验逻辑}public void processPayment() {validateSignature("...");// 支付处理逻辑}
}
三、继承场景的特殊规则
1. 方法重写限制
- 子类方法访问权限 不能缩小(可等于或扩大)
- 非法示例:
class Parent {protected void demo() {}
}class Child extends Parent {@Overridevoid demo() {} // 编译错误:不能缩小为包级私有
}
2. 构造函数访问控制
public class Singleton {private Singleton() {} // 私有构造器public static Singleton getInstance() {return Holder.INSTANCE;}private static class Holder {static final Singleton INSTANCE = new Singleton();}
}
四、最佳实践指南
-
最小化公开元素
优先使用最严格的访问级别(推荐顺序):
private→ 默认 →protected→public -
数据封装原则
- 字段声明为
private(通过getter/setter访问) - 避免
public修饰可变对象字段:
- 字段声明为
// 错误示例
public class Config {public static final Map<String, String> SETTINGS = new HashMap<>();
}// 正确示例
public class Config {private static final Map<String, String> SETTINGS = new HashMap<>();public static String getSetting(String key) {return Collections.unmodifiableMap(SETTINGS).get(key);}
}
3.接口方法规范
接口方法默认public abstract,即使不显式声明:
interface Logger {void log(String message); // 实际为public abstract
}
相关文章:
Java权限修饰符深度解析
Java权限修饰符深度解析与最佳实践 一、权限修饰符总览 Java提供四种访问控制修饰符,按访问范围从宽到窄排序如下: 修饰符类内部同包类不同包子类全局范围public✔️✔️✔️✔️protected✔️✔️✔️❌默认(无)✔️✔️❌❌pr…...
Springboot JPA ShardingSphere 根据年分表
Spring Boot集成JPA与ShardingSphere实现按年分表,需重点关注分片算法选择、时间字段映射及动态表管理。以下是实现方案: 一、依赖配置 1. 核心依赖引入 <!-- ShardingSphere JDBC --> <dependency><groupId>org.apache.shardi…...
uniapp小程序生成海报/图片并保存分享
调研结果: 方法一:canvasuni.canvasToTempFilePath耗时太长,现在卡在canvas的绘制有问题,canvas绘制的部分东西不生效但是找不到原因 方法二:使用wxml-to-canvas其实也差不多是用canvas手动绘制,可能会卡在…...
蓝桥杯刷题--宝石组合
在一个神秘的森林里,住着一个小精灵名叫小蓝。有一天,他偶然发现了一个隐藏在树洞里的宝藏,里面装满了闪烁着美丽光芒的宝石。这些宝石都有着不同的颜色和形状,但最引人注目的是它们各自独特的 “闪亮度” 属性。每颗宝石都有一个…...
红宝书第三十一讲:通俗易懂的包管理器指南:npm 与 Yarn
红宝书第三十一讲:通俗易懂的包管理器指南:npm 与 Yarn 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 一、基础概念 包管理器:帮你自动下载和管理第三方代码库(如…...
进程状态的转换
进程处于运行态时,它必须已获得所需的资源,在运行结束后就撤销。只有在时间片到或出现了比现在进程优先级更高的进程时才转变成就绪态。 就绪 → 运行 触发条件:进程被调度器选中(如时间片轮转或优先级调度&…...
SpringAOP新链浅析
前言 在复现CCSSSC软件攻防赛的时候发现需要打SpringAOP链子,于是跟着前人的文章自己动手调试了一下 参考了大佬的文章 https://gsbp0.github.io/post/springaop/#%E6%B5%81%E7%A8%8B https://mp.weixin.qq.com/s/oQ1mFohc332v8U1yA7RaMQ 正文 依赖于Spring-AO…...
【动手学深度学习】现代卷积神经网络:ALexNet
【动手学深度学习】现代卷积神经网络:ALexNet 1,ALexNet简介2,AlexNet和LeNet的对比3, AlexNet模型详细设计4,AlexNet采用ReLU激活函数4.1,ReLU激活函数4.2,sigmoid激活函数4.3,为什…...
PyTorch深度学习框架60天进阶学习计划 - 第37天:元学习框架
PyTorch深度学习框架60天进阶学习计划 - 第37天:元学习框架 嘿,朋友们!欢迎来到我们PyTorch进阶之旅的第37天。今天我们将深入探索一个非常有趣且强大的领域——元学习(Meta-Learning),也被称为"学会学习"(Learning to…...
【中检在线-注册安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…...
UE5 运行时动态将玩家手部模型设置为相机的子物体
在编辑器里,我们虽然可以手动添加相机,但是无法将网格体设置为相机的子物体,只能将相机设置为网格体的子物体 但是为了使用方便,我们希望将网格体设置为相机的子物体,这样我们直接旋转相机就可以旋转网格体࿰…...
EasyExcel-一款好用的excel生成工具
EasyExcel是一款处理excel的工具类,主要特点如下(官方): 特点 高性能读写:FastExcel 专注于性能优化,能够高效处理大规模的 Excel 数据。相比一些传统的 Excel 处理库,它能显著降低内存占用。…...
WEB攻防-Java安全JNDIRMILDAP五大不安全组件RCE执行不出网不回显
目录 1. RCE执行-5大类函数调用 1.1 Runtime方式 1.2 Groovy执行命令 1.3 脚本引擎代码注入 1.4 ProcessImpl 1.5 ProcessBuilder 2. JNDI注入(RCE)-RMI&LDAP&高版本 2.1 RMI服务中的JNDI注入场景 2.2 LDAP服务中的JNDI注入场景 攻击路径示例&#…...
UML组件图
一、UML 组件图 组件图(Component Diagram)主要用于描述系统的物理结构,用于展示可独立部署的软件模块(如微服务、动态链接库、API网关)及其交互关系。组件图中的主要元素包括: 组件(Component…...
DrissionPage移动端自动化:从H5到原生App的跨界测试
一、移动端自动化测试的挑战与机遇 移动端测试面临多维度挑战: 设备碎片化:Android/iOS版本、屏幕分辨率差异 混合应用架构:H5页面与原生组件的深度耦合 交互复杂性:多点触控、手势操作、传感器模拟 性能监控:内存…...
从 Excel 到你的表格应用:条件格式功能的嵌入实践指南
一、引言 在日常工作中,面对海量数据时,如何快速识别关键信息、发现数据趋势或异常值,是每个数据分析师面临的挑战。Excel的条件格式功能通过自动化的视觉标记,帮助用户轻松应对这一难题。 本文将详细介绍条件格式的应用场景&am…...
redis 和 MongoDB都可以存储键值对,并且值可以是复杂json,用完整例子分别展示说明两者在存储json键值对上的使用对比
Redis 存储 JSON 键值对示例 存储操作: // 存储用户信息(键:user:1001,值:JSON对象) SET user:1001 {"name":"Alice", "age":30, "address":"New York&quo…...
SQLI打靶
文章目录 一、DVWA0. Mysql与Mariasql1. 单/双引号 - 十六进制编码绕过**原理:** 2. limit 1的绕过3. 参数化查询绕过一、介绍二、PDO是一种PHP实现参数化查询的机制 三、预编译绕过 之 结构化参数 4. 反自动化手段 之 Anti-CSRF token静态:动态…...
STM32单片机入门学习——第22节: [7-2] AD单通道AD多通道
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.07 STM32开发板学习——第22节: [7-2] AD单通道&AD多通道 前言开发板说明引用解…...
python基础语法1:输入输出
1. 输出 (Output) 1.1 print() 基础 Python 使用 print() 函数向控制台输出内容。 # 输出字符串 print("Hello, World!") # 输出多个值(自动用空格分隔) print("Name:", "Alice", "Age:", 25) # 修改分隔符&…...
对Android中zygote的理解
1. Zygote的作用 Zygote是Android系统的核心进程,核心作用可归纳为以下三点: 核心作用详细说明进程孵化器作为所有应用进程的父进程,通过fork快速创建新进程(避免重复初始化虚拟机)。(system server也由z…...
【Survival Analysis】【机器学习】【1】
前言: 今年在做的一个博士课题项目,主要是利用病人的数据,训练出一个AI模型,做因果分析, 以及个性化治疗。自己一直是做通讯AI方向的,这个系列主要参考卡梅隆大学的教程,以及临床医生的角度 了…...
WebShell详解:原理、分类、攻击与防御
目录 一、WebShell的定义与核心概念 二、WebShell的分类 三、WebShell的攻击原理与常见手法 1. 攻击原理 2. 常见攻击路径 四、WebShell的危害 五、防御与检测策略 六、总结 一、WebShell的定义与核心概念 WebShell是一种以ASP、PHP、JSP等网页脚本形式存在的恶…...
JavaScript---原型和原型链
目录 一、引用类型皆为对象 二、原型和原型链是什么 三、__proto__与prototype 总结 四、原型链顶层 五、constructor 六、函数对象的原型链 一、引用类型皆为对象 原型和原型链都是来源于对象而服务于对象: JavaScript中一切引用类型都是对象,…...
离散数学问题集--问题5.9
问题 5.9 综合了计算机组成原理、数字逻辑和离散数学中的关键概念,旨在帮助学生理解二进制算术运算的硬件实现、逻辑门与算术运算的关系,以及如何使用数学方法来验证数字系统的正确性。它强调了从规范到实现再到验证的完整过程。 思想 函数抽象…...
手游防DDoS攻击SDK接入
在手游中集成防DDoS攻击SDK是抵御流量型和应用层攻击的核心手段之一。以下从SDK选型、接入流程、防护策略优化三个维度提供完整指南,并附关键代码示例: 一、SDK选型与核心能力对比 服务商优势劣势适用场景…...
Java—HTML:CSS选择器
今天我要介绍的知识点内容是Java HTML中的CSS选择器; CSS选择器用于定位HTML元素并为其添加样式。它允许我们控制网页的颜色、字体、布局和其他视觉元素。通过分离内容与样式。 下面我将介绍CSS中选择器的使用,并作举例说明; 选择器基本语…...
如何将/dev/ubuntu-vg/lv-data的空间扩展到/dev/ubuntu-vg/ubuntu-lv的空间上
要将 /dev/ubuntu-vg/lv-data 的空间扩展到 /dev/ubuntu-vg/ubuntu-lv 上,实际上是将 lv-data 的空间释放出来,并将其分配给 ubuntu-lv。以下是详细的步骤和操作说明: 已知信息 你有两个逻辑卷: /dev/ubuntu-vg/lv-data/dev/ubun…...
SSM阶段性总结
0 Pojo类 前端给后端:DTO 后端给前端:VO 数据库:PO/VO 业务处理逻辑:BO 统称pojo 1 代理模式 实现静态代理: 1定义接口2实现类3写一个静态代理类4这样在调用时就可以使用这个静态代理类来实现某些功能 实现动态代…...
Qt 5.14.2入门(一)写个Hello Qt!程序
目录 参考链接:一、新建项目二、直接运行三、修改代码增加窗口内容1、Qt 显示一个 QLabel 标签控件窗口2、添加按键 参考链接: Qt5教程(一):Hello World 程序 Qt 编程指南 一、新建项目 1、新建一个项目(…...
