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

news2024/11/18 20:45:34

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

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.coloradmin.cn/o/1443092.html

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

相关文章

【数据分享】1901~2022中国1km逐月潜在蒸散发数据集

大家新年好啊!今天给大伙儿分享的是1901~2022中国1km逐月潜在蒸散发数据集,收藏一下,过完年再看!当然了,如果有问题的朋友,可以添加俺微信交流。 1 数据简介 数据集为中国逐月潜在蒸散发,空间分…

Redis核心技术与实战【学习笔记】 - 24.Redis 脑裂

简述 所谓脑裂,就是指在主从集群中,同时有两个主节点,它们都能接收写请求。而脑裂最直接的影响就是客户端不知道该往哪个主节点写入数据,结果就是不同的客户端会往不同的主机诶点上写入数据。而且,严重的话&#xff0…

尝新果未熟,探新途未尽。寒冬凝锐气,雷鸣蓄神力——小康师兄的2023年度总结

文章目录 一、前言二、工作总结2.1 我期望的,而公司想要的2.2 公司利益VS员工利益2.3 这个问题问得很有问题 三、生活总结3.1 一胎3.2 二胎 四、其他总结4.1 博客4.2 无人自助台球馆4.3 我要出书了 五、OKR 一、前言 又是一年除夕夜,万家灯火同团圆。 老…

15.3 Redis入门(❤❤❤❤)

15.3 Redis入门❤❤❤❤ 1. redis简介与配置1.1 简介1.2 Windows安装1.3 Linux安装1.4 守护进程方式启动1.5 客户端启动与使用1.6 指定生成日志 2. 使用2.1 客户端redis使用命令2.2 redis存储的数据类型1. String字符串类型2. Hash键值类型3. List列表类型4. Set与Zset集合类型…

力扣刷题之旅:进阶篇(四)—— 滑动窗口问题

力扣(LeetCode)是一个在线编程平台,主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目,以及它们的解题代码。 --点击进入刷题地址 引言: 在编程的世界里,滑动窗口问题是一种…

python 自我检测题--part 1

1. Which way among them is used to create an event loop ? Window.mainloop() 2. Suppose we have a set a {10,9,8,7}, and we execute a.remove(14) what will happen ? Key error is raised. The remove() method removes the specified element from the set. Th…

Python算法题集_两两交换链表中的节点

Python算法题集_两两交换链表中的节点 题24:两两交换链表中的节点1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【四节点法】2) 改进版一【列表操作】3) 改进版二【三指针法】4) 改进版三【递归大法】 4. 最优算法 本文为Python算法…

幻兽帕鲁服务器怎么更新?进入游戏显示:加入的比赛正在运行不兼容的版本,请尝试升级游戏版本(阿里云)

幻兽帕鲁服务器怎么更新?进入游戏显示:加入的比赛正在运行不兼容的版本,请尝试升级游戏版本。这是因为游戏客户端或者服务器上的游戏服务端,没有更新版本。导致两个版本不一致,所以无法进入游戏。 最近幻兽帕鲁 官方客…

Git 消除对某个文件的追踪

参考: (尚未验证他的该方法) https://www.golinuxcloud.com/git-remove-file-from-tracking/https://www.golinuxcloud.com/git-remove-file-from-tracking/

第9讲 详解第 2 套真题

第9讲 详解第 2 套真题 基本编程题【15 分】简单应用题【25 分】综合应用题【20 分】问题 1【10 分】:问题 2【10 分】:各位小伙伴想要博客相关资料的话关注公众号:chuanyeTry即可领取相关资料! 基本编程题【15 分】 考生文件夹下存在一个文件 PY101.py,请写代码替换横线,不…

蓝桥杯官网练习题(翻转)

问题描述 小蓝用黑白棋的 n 个棋子排成了一行,他在脑海里想象出了一个长度为 n 的 01 串 T,他发现如果把黑棋当做 1,白棋当做 0,这一行棋子也是一个长度为 n 的 01 串 S。 小蓝决定,如果在 S 中发现一个棋子…

AB测试最小样本量

1.AB实验过程 常见的AB实验过程,分流-->实验-->数据分析-->决策:分流:用户被随机均匀的分为不同的组实验:同一组内的用户在实验期间使用相同的策略,不同组的用户使用相同或不同的策略。数据收集:…

【技巧】PCB布局技巧:带条纹的电容

这些都是无极性电容,所以这个条纹不是极性标记。一位读者得回答正确,它代表电容卷绕时,卷绕在外层的那一极。我发现现在很少有工程师知道电容一端的条纹代表什么,也不知道条纹端和不带条纹端互换带来的不同效果。即使你从来不使用…

fast.ai 深度学习笔记(二)

深度学习 2:第 1 部分第 4 课 原文:medium.com/hiromi_suenaga/deep-learning-2-part-1-lesson-4-2048a26d58aa 译者:飞龙 协议:CC BY-NC-SA 4.0 来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它,这…

Adaptec RAID 控制器arcconf 管理命令的常见的查询操作

ARCCONF命令行工具可以在服务器正常运行过程中对Adaptec RAID卡进行带内在线查询配置操作,无需重启服务器,十分方便快捷,本文讲解常见的查询操作。 一、查询流程 二、常见指令 1、查询已安装的RAID卡清单 [rootlocalhost ~]# ./arcconf-lin…

STM32 FSMC (Flexible static memory controller) 灵活静态内存控制器介绍

文章目录 1. 介绍FSMC2. FSMC特点3. Block示意图4. AHB接口4.1 Supported memories and transactionsGeneral transaction rulesConfiguration registers 5. 外部设备地址映射5.1 NOR/PSRAM地址映射将NOR Flash/PSRAM的支持进行封装 5.2 NAND/PC Card地址映射 1. 介绍FSMC 说到…

阿里云服务器4核8g的购买价格

阿里云服务器4核8g配置多少钱一年?1个月费用多少?云服务器u1实例3折优惠价955.58元一年,计算型c7云服务器4核8G价格2944.79元一年。4核8G服务器按月购买比较贵,经济型e实例4核8G配置1个月216元,通用算力型u1服务器336.…

vs用msys2编译安装 gmp

1 下载 1.1下载MSYS2工具 MSYS2 1.2 下载gmp The GNU MP Bignum Library 2 使用windows的msys2命令窗口,有三个msys2命名窗口 mingw64 3 4 命令 pacman -Syu 重启: pacman -Su 安装: pacman -S mingw-w64-x86_64-gcc pacman -S mingw-w64-x86_64-make…

2024.2.10 DMS(数据库管理系统)初体验

数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管…

问题:超声波纵波斜入射时,当入射角大于第一临界角小于第二临界角时,在第二介质内只有折射横波。 #微信#经验分享#其他

问题:超声波纵波斜入射时,当入射角大于第一临界角小于第二临界角时,在第二介质内只有折射横波。 参考答案如图所示