【Java基础-27】Java中的访问修饰符:分类、作用及应用场景
在Java编程中,访问修饰符(Access Modifiers)是控制类、方法、变量和构造函数访问权限的关键工具。通过合理使用访问修饰符,可以有效地封装代码,保护数据,并确保代码的安全性和可维护性。本文将详细介绍Java中的四种访问修饰符:public、protected、default(包级私有)和private,并探讨它们的作用及应用场景。
1. 访问修饰符的分类
Java提供了四种访问修饰符,用于控制类、方法、变量和构造函数的可见性:
public:公共的,表示对所有类可见。protected:受保护的,表示对同一包内的类和所有子类可见。default(包级私有):默认的,表示对同一包内的类可见。private:私有的,表示仅对同一类内部可见。
1.1 访问修饰符的可见性范围
| 访问修饰符 | 同一类 | 同一包 | 子类 | 其他包 |
|---|---|---|---|---|
public | ✔️ | ✔️ | ✔️ | ✔️ |
protected | ✔️ | ✔️ | ✔️ | ❌ |
default | ✔️ | ✔️ | ❌ | ❌ |
private | ✔️ | ❌ | ❌ | ❌ |
2. 访问修饰符的作用
2.1 public
public是最宽松的访问修饰符,表示对所有类可见。使用public修饰的类、方法、变量或构造函数可以在任何地方被访问。
应用场景:
- 类:通常用于定义公共API,供其他包中的类使用。
- 方法:用于定义类的公共接口,供外部调用。
- 变量:用于定义类的公共属性,供外部访问和修改。
示例代码:
public class PublicExample {public int publicVariable = 10;public void publicMethod() {System.out.println("This is a public method");}
}public class Main {public static void main(String[] args) {PublicExample obj = new PublicExample();System.out.println(obj.publicVariable); // 输出: 10obj.publicMethod(); // 输出: This is a public method}
}
2.2 protected
protected修饰符表示对同一包内的类和所有子类可见。protected成员不能被不同包中的非子类访问。
应用场景:
- 方法:用于定义子类可以重写的方法,同时限制外部包的访问。
- 变量:用于定义子类可以访问的变量,同时限制外部包的访问。
示例代码:
package com.example.package1;public class ProtectedExample {protected int protectedVariable = 20;protected void protectedMethod() {System.out.println("This is a protected method");}
}package com.example.package1;public class SubClass extends ProtectedExample {public void accessProtectedMembers() {System.out.println(protectedVariable); // 输出: 20protectedMethod(); // 输出: This is a protected method}
}package com.example.package2;import com.example.package1.ProtectedExample;public class OtherPackageClass {public static void main(String[] args) {ProtectedExample obj = new ProtectedExample();// 编译错误: protectedVariable 和 protectedMethod 在不同包中不可见// System.out.println(obj.protectedVariable);// obj.protectedMethod();}
}
2.3 default(包级私有)
default修饰符是默认的访问级别,表示对同一包内的类可见。如果一个类、方法或变量没有显式地指定访问修饰符,那么它默认是default。
应用场景:
- 类:用于定义包内使用的工具类或辅助类。
- 方法:用于定义包内使用的辅助方法。
- 变量:用于定义包内使用的辅助变量。
示例代码:
package com.example.package1;class DefaultExample {int defaultVariable = 30;void defaultMethod() {System.out.println("This is a default method");}
}package com.example.package1;public class SamePackageClass {public static void main(String[] args) {DefaultExample obj = new DefaultExample();System.out.println(obj.defaultVariable); // 输出: 30obj.defaultMethod(); // 输出: This is a default method}
}package com.example.package2;import com.example.package1.DefaultExample;public class OtherPackageClass {public static void main(String[] args) {DefaultExample obj = new DefaultExample();// 编译错误: defaultVariable 和 defaultMethod 在不同包中不可见// System.out.println(obj.defaultVariable);// obj.defaultMethod();}
}
2.4 private
private是最严格的访问修饰符,表示仅对同一类内部可见。使用private修饰的成员不能被外部类访问。
应用场景:
- 方法:用于定义类的内部实现细节,防止外部调用。
- 变量:用于定义类的私有属性,防止外部直接访问和修改。
示例代码:
public class PrivateExample {private int privateVariable = 40;private void privateMethod() {System.out.println("This is a private method");}public void accessPrivateMembers() {System.out.println(privateVariable); // 输出: 40privateMethod(); // 输出: This is a private method}
}public class Main {public static void main(String[] args) {PrivateExample obj = new PrivateExample();obj.accessPrivateMembers();// 编译错误: privateVariable 和 privateMethod 在类外部不可见// System.out.println(obj.privateVariable);// obj.privateMethod();}
}
3. 访问修饰符的应用场景
3.1 封装性
访问修饰符是实现封装性的关键工具。通过将类的内部实现细节(如变量和方法)设置为private,可以防止外部直接访问和修改,从而保护数据的安全性。
3.2 继承与多态
在继承和多态的场景中,protected修饰符非常有用。它允许子类访问和重写父类的方法,同时限制外部包的访问,从而实现更灵活的代码设计。
3.3 API设计
在设计公共API时,public修饰符用于定义类的公共接口,供外部调用。而private和default修饰符则用于隐藏内部实现细节,确保API的稳定性和安全性。
4. 总结
访问修饰符是Java中控制类、方法、变量和构造函数访问权限的重要工具。通过合理使用public、protected、default和private修饰符,可以实现代码的封装性、继承性和多态性,从而提高代码的安全性和可维护性。
在实际开发中,建议根据具体需求选择合适的访问修饰符,确保代码的可见性和安全性。如果你有任何问题或建议,欢迎在评论区留言讨论。
相关文章:
【Java基础-27】Java中的访问修饰符:分类、作用及应用场景
在Java编程中,访问修饰符(Access Modifiers)是控制类、方法、变量和构造函数访问权限的关键工具。通过合理使用访问修饰符,可以有效地封装代码,保护数据,并确保代码的安全性和可维护性。本文将详细介绍Java…...
Redis+注解实现限流机制(IP、自定义等)
简介 在项目的使用过程中,限流的场景是很多的,尤其是要提供接口给外部使用的时候,但是自己去封装的话,相对比较耗时。 本方式可以使用默认(方法),ip、自定义参数进行限流,根据时间…...
SAP从入门到放弃系列之委外分包(Subcontracting)-Part1
以前写过一篇委外相关的文章,没有很详细的写。只是一个概念的概述ERP实施-委外业务-委外采购业务 最近看PA教材,遇到了这块内容,就再详细的整理一下SAP关于委外的理论知识。 文章目录 概述分包和物料需求计划 (MRP)委外分包订单分包委外业务…...
nlp新词发现——浅析 TF·IDF
传统nlp任务处理文本及其依赖已有的词表,只有在词表里出现的词才能被识别并加以处理。但这也带来了一些问题: 假设没有词表,如何从文本中发现新词? 随着时间推移,新词会不断出现,固有词表会过时࿰…...
WebGL2示例项目常见问题解决方案
WebGL2示例项目常见问题解决方案 webgl2examples Rendering algorithms implemented in raw WebGL 2. [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/we/webgl2examples 项目基础介绍 WebGL2示例项目(https://github.com/tsherif/webgl2examples.gi…...
鸿蒙元服务从0到上架【第三篇】(第二招有捷径)
第一招:开始发布元服务 AppGallery 上传通过IDE生成的图标,后面按照步骤填写 后台有隐私政策链接生成处,前往填写生成 第二招:用户协议 对于没有服务器或者是需要极速开发的开发者,可通过gitee生成用户协议&…...
Jimureport h2命令执行分析记录
首先找testConnection接口,前面进行了jimureport-spring-boot-starter-1.5.8.jar反编译查找,接口找到发现请求参数是json var1是JmreportDynamicDataSourceVo类型,也就是如上图的dbSource,根据打印的结果可以知道这里是local cac…...
vue 集成 webrtc-streamer 播放视频流 - 解决阿里云内外网访问视频流问题
资料: 史上最详细的webrtc-streamer访问摄像机视频流教程-CSDN博客 webrtc目录 前端集成 html文件夹里的webrtcstreamer.js,集成到前端,可以访问webrtc,转换rtsp为webrtc视频流,在前端video中播放 <videoref&quo…...
进网许可认证、交换路由设备检测项目更新25年1月起
实施时间 2025年1月1日起实施 涉及设备范围 核心路由器、边缘路由器、以太网交换机、三层交换机、宽带网络接入服务器(BNAS) 新增检测依据 GBT41266-2022网络关键设备安全检测方法交换机设备 GBT41267-2022网络关键设备安全技术要求交换机设备 GB/…...
Provides transitive vulnerable dependency maven 提示依赖存在漏洞问题的解决方法
问题描述 如下图所示,对于 java 项目某些依赖,IDEA 提示,引用了含有漏洞的依赖。如果是单个依赖,可以考虑直接升级版本即可。但是对于传递性依赖,比如 flink 项目中,依赖的部分模块,它们自己依…...
WebAuthn 项目常见问题解决方案
WebAuthn 项目常见问题解决方案 webauthn Webauthn / passkeys helper library to make your life easier. Client side, server side and demo included. [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/webaut/webauthn 项目基础介绍 WebAuthn 项目是一个开源…...
LeetCode 844. 比较含退格的字符串 (C++实现)
1. 题目描述 给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。 注意:如果对空文本输入退格字符,文本继续为空。 示例 1: 输入:s …...
Python8-写一些小作业
记录python学习,直到学会基本的爬虫,使用python搭建接口自动化测试就算学会了,在进阶webui自动化,app自动化 python基础8-灵活运用顺序、选择、循环结构 写一些小练习题目1、给一个半径,求圆的面积和周长,…...
C++ STL vector基本原理和用法
文章目录 基本原理1. 数据存储结构2. 内存管理机制3. 迭代器实现原理4. 元素访问原理5. 插入和删除元素原理 常见用法1. 概述2. 包含头文件3. 定义和初始化4. 常用成员函数5. 迭代器6. 内存管理与性能特点7. 应用场景 基本原理 以下是关于 std::vector 的基本原理讲解…...
【计算机视觉基础CV-图像分类】05 - 深入解析ResNet与GoogLeNet:从基础理论到实际应用
引言 在上一篇文章中,我们详细介绍了ResNet与GoogLeNet的网络结构、设计理念及其在图像分类中的应用。本文将继续深入探讨如何在实际项目中应用这些模型,特别是如何保存训练好的模型、加载模型以及使用模型进行新图像的预测。通过这些步骤,读…...
【人工智能-初级】基于用户的协同过滤推荐算法
文章目录 1. 数据集2. 实验代码3. 代码解释4. 实验结果5. 评估基于用户的协同过滤算法是一种常见的推荐算法,它的核心思想是根据用户之间的相似性来进行推荐。 实验案例: 使用的是电影推荐数据集 MovieLens,实验中我们会通过用户评分数据计算用户之间的相似性,并使用基于用户…...
如何识别钓鱼邮件和诈骗网站?(附网络安全意识培训PPT资料)
识别钓鱼邮件和诈骗网站是网络安全中的一个重要环节。以下是一些识别钓鱼邮件和诈骗网站的方法: 识别钓鱼邮件: 检查发件人地址: 仔细查看发件人的电子邮件地址,看是否与官方域名一致。 检查邮件内容: 留意邮件中是否…...
Rust 在前端基建中的使用
摘要 随着前端技术的不断发展,前端基础设施(前端基建)的建设已成为提升开发效率、保障产品质量的关键环节。然而,在应对复杂业务场景与高性能需求时,传统的前端技术栈逐渐暴露出诸多不足。近年来,Rust语言…...
【人工智能】基于Python和OpenCV实现实时人脸识别系统:从基础到应用
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着人工智能和计算机视觉的快速发展,人脸识别技术已广泛应用于监控、安全、社交媒体、金融和医疗等领域。本文将介绍如何利用Python和Ope…...
Python 自动化 打开网站 填表登陆 例子
图样 简价: 简要说明这个程序的功能: 1. **基本功能**: - 自动打开网站 - 自动填写登录信息(号、公司名称、密码) - 显示半透明状态窗口实时提示操作进度 2. **操作流程**: - 打开网站后自动…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
