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

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

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修饰符外,还需要考虑其他安全性措施,如不可变性、防御性编程和安全检查等。

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

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

相关文章

【从零到Offer】MySQL最左匹配

前言 ​ 相信大家在日常开发时,也经常能听到“最左匹配”这个词,那么什么是最左匹配呢?本篇文章就带你一起探索“最左匹配”的神奇秘密。 什么是最左匹配 ​ 最左匹配,通常指的是最左前缀匹配原则,即MySQL在检索数据…

联想thinkpad-E450双系统升级记

早期笔记本联想thinkpad-E450双系统 大约16年花4000多大洋,买了一台thinkpad-E450屏幕是16寸本,有AMD独立显卡,i5cpu,4G内存。 . 后来加了一个同型号4G内存组成双通道, . 加了一个三星固态500G, . 换了一个…

【C++】类的隐式类型转换

文章目录 前言一、隐式类型转换二、explicit关键字总结 前言 一、隐式类型转换 C 类的隐式类型转换是指当一个类定义了适当的构造函数或转换函数时,可以在需要时自动进行类型转换,而无需显式调用转换函数或构造函数。这使得代码更具灵活性和简洁性。下面…

备战蓝桥杯---动态规划(入门2)

今天主要介绍区间dp比较难的题: 下面是分析: 我们如果先固定点V0,那我们得去枚举两个点使它构成三角形,同时求目标值也比较难确定(起始与终止都带0),于是我们考虑固定边,我们固定v0…

DS18B20 与 单总线

学习链接:学习B站 up 主金善愚的DS18B20课程 一、单总线概述 单总线芯片,在其内部的 ROM 中都编制好了唯一的序列号(64位)。 单总线芯片在应用时对时序的要求非常高。 二、单总线的基本操作 三、DS18B20的主要性能 电源电压范围&…

「数据结构」哈希表1:基本概念

🎇个人主页:Ice_Sugar_7 🎇所属专栏:Java数据结构 🎇欢迎点赞收藏加关注哦! 基本概念 🍉哈希表🍉哈希冲突🍌负载因子调节🍌解决哈希冲突🥝1. 闭散…

34 使用 LNMP 架构部署动态网站环境

源码包程序 LNMP 动态网站部署架构 LNMP 动态网站部署架构是一套由 Linux Nginx MySQL PHP 组成的动态网站系统 解决方案。 1. 准备工作 在使用源码包安装服务程序之前,首先要让安装主机具备编译程序源码的环境。这需要 具备 C 语言、C语言、Perl 语言的编译器&…

【Linux系统学习】2.Linux基础命令

Linux基础命令 Linux的目录结构 Linux命令入门 目录切换相关命令(cd/pwd) 相对路径、绝对路径和特殊路径符 创建目录命令(mkdir) 文件操作命令part1(touch、cat、more) 文件操作命令part2(cp、mv、rm) 查找命令(which、find) grep、wc和管道符…

AI绘画作品的展示和变现-2

4.7 制作红包封面 中国的节日和传统文化元素仍然可以成为创作者们的创作灵感,创造出更多的变现机会。比如元宵节,可以制作大型元宵图案,进行引流并卖出元宵。 而春分、谷雨等节气也可以成为创作的灵感来源,创作出与之相关的图案&…

双场板功率GaN HEMT电容模型以精确模拟开关行为

标题:Capacitance Modeling in Dual Field-Plate Power GaN HEMT for Accurate Switching Behavior(TED.16年) 摘要 本文提出了一种基于表面电位的紧凑模型,用于模拟具有栅极和源极场板(FP)结构的AlGaN/G…

更新至2022年,各省人口高质量城镇化指标体系构建原始数据(13个指标)

更新至2022年,各省人口高质量城镇化指标体系构建原始数据 1、时间:更新至2022年,具体每个指标时间见下文 2、来源:整理自国家统计局、统计年鉴 3、范围:31省市 4、指标: 2008-2022年每十万人口高等学校…

vue3 腾讯tdesign 后台管理框架的使用

1.介绍 TDesign 是具有包容性的设计体系,它强调为业务提供产品、服务等过程中,追求以人为本、人人受益的包容性,要求搭建过程中,了解业务底层,理解业务场景的多样性,并在繁杂的业务场景中寻找共性和特性&a…

下个目标,突破 10w+

转眼间,2023 年已经过去了,今天是大年初四,还有十来天就马上除夕了,迈入新的一年。 回顾 2023 年,如果让我给自己打分,我算是 7.5 分吧。 在这一年了,工作上表现平平,并没有什么突…

Ubuntu Desktop - Screenshot (截图工具)

Ubuntu Desktop - Screenshot [截图工具] 1. Search your computer -> Screenshot -> Lock to Launcher2. gnome-screenshot3. System Settings -> Keyboard -> ShortcutsReferences 1. Search your computer -> Screenshot -> Lock to Launcher 2. gnome-s…

网络渗透测试:Wireshark抓取qq图片

Wireshark Wireshark Downloadhttps://www.wireshark.org/download.html 简介 WireShark是非常流行的网络封包分析工具,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程中各种问题定位。本文主要内容包括: 1、Wireshar…

【Vitis】Vitis HLS简介

Vitis HLS简介 Vitis™HLS是一种高层次综合工具,支持将C、C和OpenCL™函数硬连线到器件逻辑互连结构和RAM/DSP块上。 Vitis HLS可在Vitis应用加速开发流程中实现硬件内核,并使用C/C语言代码在VivadoDesign Suite中为赛灵思器件设计开发RTL IP。 【Vitis…

智慧医院系统架构整体设计与实现

随着信息技术的不断发展,智慧医院系统作为医疗行业的重要应用,正在逐渐成为医院管理和服务的重要工具。本文将介绍智慧医院系统的整体架构设计原则和关键组件,以及如何实现一个安全、高效和可扩展的智慧医疗服务平台。 内容: 1.…

MQTT的学习与应用

文章目录 一、什么是MQTT二、MQTT协议特点三、MQTT应用领域四、安装Mosquitto五、如何学习 MQTT 一、什么是MQTT MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,设计用于在低带宽、不稳定的网络环境中进行高效的通信…

Codeforces Round 729 (Div. 2)B. Plus and Multiply(构造、数学)

题面 链接 B. Plus and Multiply 题意 给定 n , a , b n,a,b n,a,b 可以进行的操作 ∗ a *a ∗a b b b 最开始的数是1 问能否经过上面的两种操作将1变为n 题解 这题的关键是能不能想出来这个集合里面…

Java实现免税店商城管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.2 研究方法 三、系统展示四、核心代码4.1 查询免税种类4.2 查询物品档案4.3 新增顾客4.4 新增消费记录4.5 审核免税 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的免税店商城管理系…