从源码学习访问控制符使用

从源码学习访问控制符使用

Java中的访问控制符

​ 在Java中,有四个访问控制符:public、protected、default(默认或缺省,不使用关键字)和private。

​ 它们的访问范围如下:

  1. public:公共访问权限,具有最宽松的访问权限。可以被任何类访问,无论是否在同一个包中。
  2. protected:受保护的访问权限。可以在同一个包中的其他类中被访问,以及在不同包的子类中访问。但是,它不能被同一个包中的非子类类访问。
  3. default:默认的访问权限,没有使用任何关键字。包级访问权限,只能在同一个包中的其他类中访问。
  4. private:私有的访问权限,具有最严格的访问权限。只能在定义它的类中访问,其他任何类都无法访问。

​ 下面是四个访问控制符的访问范围总结:

访问控制符同一个类同一个包不同包的子类不同包的非子类
publicYesYesYesYes
protectedYesYesYesNo
defaultYesYesNoNo
privateYesNoNoNo

​ 通过合理使用访问控制符,可以控制类、方法、变量等成员的访问权限,从而提高代码的封装性和安全性。

​ 访问控制符,可以用来修饰类、方法和变量。使用不同的控制符,可以达到不同的权限控制效果。

​ 根据迪米特法则,也即最少知道原则,我们应该尽可能少的暴露内部细节,只需要暴露需要对外暴露的部分,已提高封装性和安全性。接下来就从源码层面,看下访问控制符是如何实际使用。

修饰类

  • public修饰的类,是公共类,不同包下可以访问的类,也是最常见的类修饰符。比如Collections类,需要它的时候,我们随时都可以访问到。

    在这里插入图片描述

  • protected修饰符不能直接用于类。(内部类允许但很少用)

  • default修饰的类,具有包级访问权限,可以用来限定此类只在本包内使用。

    在这里插入图片描述

    如SignedMutableBigInteger类,它就使用了缺省的控制符,它只在包内被使用。具体到default修饰的类的场景,有以下的情况

    1. 封装性:可以隐藏其实现细节,只对同一个包内的其他类可见。这种封装性可以防止其他包的类直接访问该类,从而保护类的内部状态和行为。

    2. 模块化和组织:可以帮助开发者将相关的类组织在同一个包内,使得代码更加清晰和易于维护。

    3. API设计:有时候某个类的功能仅适用于同一个包内的其他类,不适合对外公开。这样的类可以被声明为包级访问权限,以避免误用和滥用。

  • private修饰符不能直接用于类。但可以用来修饰内部类,表示此内部类仅能在此类中使用。

    在这里插入图片描述

    比如Hashtable中的EntrySet类,就是被private修饰的内部类。通常一个类被设计为private修饰的内部类,往往有以下考虑:

    ​ 可以实现封装和隐藏内部细节,提高代码的可维护性和安全性。

修饰方法

  • public修饰方法,表示是公开的方法,不同包下可以调用到此方法,这也是最常见的方法修饰符

    在这里插入图片描述

  • protected修饰的方法,可以被包内访问,同时也可以被包外的子类访问。提供了一种介于公共访问和私有访问之间的访问级别。在继承、封装和包内访问等场景下起到了重要的作用,帮助实现类的继承、封装和扩展。

    在这里插入图片描述

    例如AbstractList的removeRange方法就满足上述用法。

    当一个方法被protected修饰时,通常是基于以下场景:

    1. 继承和重写:protected修饰的方法可以被子类继承和重写。这样可以在子类中对父类方法进行自定义实现,扩展或修改其行为。

    2. 子类调用:protected修饰的方法可以在父类中调用,同时也可以在子类中通过super关键字调用。这使得父类可以在特定情况下,控制子类对方法的访问权限,提供更加灵活的设计和实现。

  • default修饰的方法,可在同一个包中的其他类中访问。

    它限制了方法的访问范围,只允许同一个包中的类使用该方法,提高了类的封装性和安全性。

    同时,这些方法也没有被声明为public,避免了对外部类的不必要暴露。

    在这里插入图片描述

  • private修饰的方法,只能在当前类中被使用。

    1. 比较常用的是视为是内部方法,不对外暴露。

      在这里插入图片描述

      ​ 比如LinkedHashMap的一个private修饰的方法,就只在其内部调用使用,隐藏了内部细节,没有对外暴露。

    2. 当一个构造方法被private修饰时,可以确保类示例不可对外通过new的创建,这可以用来实现单例模式或工厂模式等。

      在这里插入图片描述

      ​ 比如DirectMethodHandle类,就是将其构造方法私有化,然后通过静态的外部接口来获取示例,来实现工厂模式。

    3. 还有工具类或者辅助类也使用private修饰构造方法。这些类不需要实例化对象,只提供静态方法或者静态字段来完成特定的功能。

      在这里插入图片描述

      ​ 比如Math就是一个工具类,它将构造方法私有,然后通过静态方法提供所需的功能。

修饰变量

  • public修饰的变量可以被任何类访问。当需要将变量暴露给外部类或其他模块使用时,可以使用public修饰。

    ​ public修饰的变量通常用于定义常量,以供其他类直接使用。常量在Java中通常使用static final修饰,例如公共的静态常量。

    在这里插入图片描述

    ​ 比如Math类中的常量E和PI,用public修饰,可以供外部直接调用。

    ​ 需要注意的是,公共变量的可见性较高,可以被任何类直接访问和修改。这可能导致类的内部状态被不合理地修改,破坏了封装性。

    ​ 因此,在设计和使用公共变量时,需要慎重考虑其对类的封装性和安全性的影响。建议在设计类时,尽量使用私有变量,并提供公共的访问方法(getter和setter)来控制对变量的访问和修改。

  • protected修饰的变量,一般是为了给继承类提供一些内部数据结构或状态的访问权限,而不是直接暴露给外部使用。

    因此,在使用这些变量时,仍然需要遵循面向对象的封装原则,尽量减少直接访问这些变量的场景,而是通过提供合适的方法来进行操作。

    在这里插入图片描述

    例如Calendar的time字段,它被protected修饰,是为了方便继承类访问和修改日历的时间。

  • default较少用来修饰变量。

    ​ 一些使用了默认修饰符,但它们通常被声明为transient(瞬态),表示它们在序列化过程中将被忽略。这是因为在序列化过程中,只有具有public或private修饰符的变量才会被序列化和反序列化。

    在这里插入图片描述

    ​ 其次,还有一些常量,使用了默认修饰符,用来表示可在同一个包下访问此静态常量。在这里插入图片描述

  • private修饰的变量,只能在本类中使用,往往视为类的内部变量,不对外暴露。如果要访问,往往通过暴露的公共方法来访问。

    在这里插入图片描述

    ​ 比如图中Calendar中,被private修饰的变量和常量,都只在类的内部使用。

    ​ 使用private修饰变量或方法是一种常见的封装和隐藏内部细节的方式。这样做有以下几个考虑:

    1. 封装和隐藏:private修饰符可以将变量或方法隐藏在类的内部,不允许外部类直接访问。这样可以有效地封装类的内部实现细节,避免外部类对内部实现的依赖和直接操作,提高代码的可维护性和安全性。
    2. 访问控制和安全:使用private修饰符可以限制对变量或方法的访问范围,只允许本类中的其他方法访问。这样可以更好地控制类的使用方式,避免不相关的类直接访问和操作内部状态,减少耦合性。
    3. 数据封装:private修饰符可以将变量封装在类的内部,通过公共的getter和setter方法来访问和修改变量的值。这样可以控制访问方式和对变量的操作,实现数据的封装和保护。

    ​ 需要注意的是,尽管使用private修饰符可以隐藏内部细节,但仍然可以通过反射机制来绕过访问限制。

    ​ 因此,在设计类时,除了使用private修饰符外,还需要考虑其他安全性措施,如不可变性、防御性编程和安全检查等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【人工智能】人工智能 – 引领未来科技的潮流

写在前面 引言红利挑战结论 引言 人工智能是指使计算机系统表现出类似于人类智能的能力。其目标是实现机器具备感知、理解、学习、推理和决策等智能行为。人工智能的发展可以追溯到上世纪50年代,随着计算机技术和算法的不断进步,人工智能得以实现。 今天…

『运维备忘录』之 Kubernetes(K8S) 常用命令速查

一、简介 kubernetes,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写,是一个开源的,用于管理云平台中多个主机上的容器化的应用。kubernetes是基于容器技术的分布式架构解决方案,具有完备的集群管理能力&a…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 2月8日,星期四

每天一分钟,知晓天下事! 2024年2月8日 星期四 农历腊月廿九 1、 气象局:南方地区雨雪冰冻天气趋于结束,需警惕融雪融冰引发的次生灾害。 2、 应急管理部:1月各种自然灾害共造成228.9万人次不同程度受灾,直…

网络套件字(理论知识)

一、源IP地址和目的IP地址 上次说到IP地址是为了是为了让信息正确的从原主机传送到目的主机,而原IP地址和目的IP地址就是用于标识两个主机的,既然叫做地址必然有着路径规划的作用,而路径规划最重要的就是,从哪来到哪去&#xff0…

计算机毕业设计 | SSM超市进销存管理系统(附源码)

1,绪论 1.1 开发背景 世界上第一个购物中心诞生于美国纽约,外国人迈克尔库伦开设了第一家合作商店,为了更好地吸引大量客流量,迈克尔库伦精心设计了低价策略,通过大量进货把商品价格压低,通过商店一次性集…

论文封面下划线总是对不齐,这3步你肯定没做!

论文封面 在写论文时,总会遇到论文封面下划线对不齐,学会下面这三招轻松搞定封面。 解决方法 ①选中文字,点击“插入”,选择“表格”,找到“文本转化为表格”。列数为2,文字分割位置选空格,设置…

路由器如何映射端口映射?

在现代互联网中,随着网络应用的不断发展,很多用户需要进行远程访问或搭建服务器来满足自己的需求。由于网络安全的原因,直接将内网设备暴露在公网中是非常危险的。为了解决这个问题,路由器映射端口映射技术应运而生。本文将介绍什…

Python进阶--爬取美女图片壁纸(基于回车桌面网的爬虫程序)

目录 一、前言 二、爬取下载美女图片 1、抓包分析 a、分析页面 b、明确需求 c、抓包搜寻 d、总结特点 2、编写爬虫代码 a、获取图片页网页源代码 b、提取所有图片的链接和标题 c、下载并保存这组图片 d、 爬取目录页的各种类型美女图片的链接 e、实现翻页 三、各…

HACKTHEBOX通关笔记——mango(退役)

信息收集 端口扫描 ┌──(root㉿kali)-[~] └─# nmap -sC -sV -A -p- --min-rate10000 10.129.229.185 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-01-31 20:44 EST Warning: 10.129.229.185 giving up on port because retransmission cap hit (10). Nmap scan …

秘塔科技推出AI搜索产品「秘塔AI搜索」

近日,国内一家人工智能科技公司(秘塔科技)推出了一款AI搜索产品——秘塔AI搜索,能够大幅提升搜索效率,解决日常生活、工作学习等场景中遇到的各类搜索需求。 秘塔AI搜索官网:https://metaso.cn/ 相较于传统…

《小狗钱钱2》读书笔记

目录 前言 作者简介 经典语句摘录 前言 尽管[ 智慧是无法传授的], 但读书可以启发思路,开拓解题方法。 《小狗钱钱2》这本书是在《小狗钱钱》的基础上,作业进一步阐述了关于人生出生的智慧。 当然了,这本书感觉更适合成年人来看&#xff0…

【集合系列】Map 双列集合

Map双列集合 1. 概述2. 方法3. 代码示例4. 输出结果5. 注意事项 实现类: HashTable、HashMap、TreeMap、Properties、LinkedHashMap 其他集合类 具体信息请查看 API 帮助文档 1. 概述 Map是Java中的一种数据结构,用于存储键值对(key-value p…

LayUI中表格树折叠 --

1、先将插件源码进行下载,新建 tableTree.js 文件,将源码放进去 2、将 tableTree.js 文件 配置之后,在需要使用的页面进行引入: layui.define(["tableTree"],function (exports) {var tableTree layui.tableTree;// …

JavaScript相关(四)——事件循环

参考: 极客时间-消息队列和事件循环 js中的宏任务与微任务 javascript是单线程的原因是什么 JS是单线程语言,在浏览器执行渲染进程时,会遇到很多不同的事件类型,比如操作DOM节点、计算样式布局、执行JS任务、用户输入等&#xff…

Transformer实战-系列教程13:DETR 算法解读

🚩🚩🚩Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 1、物体检测 说到目标检测你能想到什么 faster-rcnn系列,开山之作&…

【Spring Boot】第二篇 自动装配原来就这么简单

导航 一. 什么是自动装配?二. 如何实现自动装配?1. 配置清单在哪里?2. 自动装配实现核心点1: 从META‐INF/spring.factories路径读取配置类清单核心点2: 过滤第一次过滤: 根据EnableAutoConfiguration注解中exclude和excludeName属性第二次过滤: 通过AutoConfigurationImpor…

【学网攻】 第(23)节 -- PPP协议

系列文章目录 目录 系列文章目录 文章目录 前言 一、PPP协议是什么? 二、实验 1.引入 实验目的 实验背景你是某公司的网络管理员,现在需要与另一个公司进行通信,需要你配置PPP协议保证双方发送的人是真正的而非黑客 技术原理 实验步骤新建Pack…

Backtrader 文档学习- Plotting - Plotting Date Ranges

Backtrader 文档学习- Plotting - Plotting Date Ranges 1.概述 1.9.31.x版本增加了绘制部分图形的功能。 可以使用策略实例中保留完整长度的时间戳数组的索引或者使用实际的datetime.date 或datetime.datetime 实例来限制需要绘制的内容。 仍然可以使用标准的cerebro.plot…

自然语言学习nlp 六

https://www.bilibili.com/video/BV1UG411p7zv?p118 Delta Tuning,尤其是在自然语言处理(NLP)和机器学习领域中,通常指的是对预训练模型进行微调的一种策略。这种策略不是直接更新整个预训练模型的权重,而是仅针对模型…

YOLOv8改进 更换轻量级网络结构

一、GhostNet论文 论文地址:1911.11907.pdf (arxiv.org) 二、 GhostNet结构 GhostNet是一种高效的目标检测网络,具有较低的计算复杂度和较高的准确性。该网络采用了轻量级的架构,可以在计算资源有限的设备上运行,并能够快速地实时检测图像中的目标物体。 GhostNet基于Mo…