OOP丨《Java编程思想》阅读笔记Chapter 6 : 访问权限控制

《Java编程思想》Chapter 6 : 访问权限控制


  • 1. 前言
    • 1.1. 访问权限控制的等级
    • 1.2. package关键字的引入
  • 2. 包:库单元
    • 2.1. 代码组织
    • 2.2. 包名的创建
  • 3. Java访问权限修饰词
    • 3.1. 包访问权限
    • 3.2. public: 接口访问权限
    • 3.3. private: 你无法访问
    • 3.4. protected: 继承访问权限
  • 4. 接口和实现
    • 4.1. 封装
  • 5. 类的访问权限
    • 5.1. 部分额外限制
    • 5.2. 作用
    • 5.3. 一些特殊用法

1. 前言

我们总是会发现我们希望对于我们的代码进行重写以改进
使得其更可读、更易理解,因而更具有可维护性
这便是重构

但是我们改变代码,就可能会引发它的变化
但对于使用者来说,会希望代码保持不变
这边产生一个问题:如何将代码中变动的事物与不变的事物区分开来?
这对于类库尤其重要

这便是访问权限控制的作用
Java提供 访问权限修饰词
用于向代码使用者指明,哪部分是可以用的,哪部分是不可以用的

1.1. 访问权限控制的等级

从最大权限到最小权限

  1. public
    任何地方都可以访问
  2. protected
    同一个包内,或者子类可以访问
  3. 包访问权限(no keyword, default)
    同一个包内可以访问
  4. private
    只有类内可以访问

1.2. package关键字的引入

对于 访问权限修饰词
还存在着如何将构件捆绑到一个内聚的类库单元中的问题
Java使用 package 关键字来解决这个问题

2. 包:库单元

**包(package)**内包含有一组类
被组织在单一的名字空间之下
也就是包名

我们一直使用的导入,就是提供一个管理名字空间的机制
我们平时编写的Java源文件,通常被称为编译单元(或转译单元)
每个编译单元只能由不超过一个public
编译单元中的public类对包外可见

2.1. 代码组织

我们可以发现,我们对一个编译单元进行编译后
其中的每个类都会有一个输出文件,有着.class的后缀
他们可以被打包并压缩为一个java文档文件(JAR,使用Java的jar文档生成器)
而类库则实际上是一组类文件
其中每个文件都有一个public类,以及任意数量的非public
public类的名字必须与文件名相同

关键字package用于将类库中的类组织在一起:

// 在一个包中的类
package PackageTest;

若使用package语句,则其必须是文件中除注释外的第一句代码

包的命名规则:
package的命名全部使用小写字母,包括中间的字

对于packageimport的理解:
将单一的全局名字空间分割
使得不论多少人进行编写,也不会出现名称冲突的问题

2.2. 包名的创建

包从未整被真正打包为单一的文件
且一个包可以有多个.class文件构成
这可能造成复杂的情况

为了避免这种情况,我们将.class文件都置于一个目录之下
利用操作系统的层次化化文件结构来解决此问题
这是Java解决混乱问题采用的一种方式

同时另外两个问题也可以被解决:

  1. 如何创建独一无二的名称?
  2. 如何查找可能隐藏于目录结构中某处的类?

包名的创建:
依据惯例,报名使用创建者的反顺序域名
(域名是第一无二的,那么包名因而也是独一无二的)
没有域名,也可以采用不太可能重复的组合
例子top.thesumst.lab

寻址方法:
package名称分解为系统上的一个目录
然后在该目录下寻找.class文件

Java解释器寻找.class运行过程大致图解:

graph LRA[Java解释器] --> B[寻找CLASSPATH环境变量]B --> C[寻找包名]C --> |包名重构,将点替换为路径|D[寻找包名对应的目录]D --> E[寻找类文件]E --> F[加载类]

p.s. 使用jar文件时,必须在类路径中将jar文件的实际名称写清楚
(实际上可以理解为一个目录的根目录)

冲突处理:
可以想象,还是哟可能出现几个包中出现重复类名的情况
如果我们使用通配符*导入包,那么可能会出现问题
此时我们需要指明具体的包名
或者我们可以使用import语句的全名形式,指定导入类
从而大大降低了冲突的可能性

p.s. 默认包:当没有使用package语句时,类位于默认包中,同样目录下的默认包中的类之间具有包访问权限

3. Java访问权限修饰词

Java中的四种Java访问权限修饰词:

  • public
  • protected
  • 包访问权限(no keyword, default)
  • private

他们用于在类中每个实例变量或方法前进行修饰
并仅作用于这个定义
其中,不提供任何访问权限修饰词,意味着包访问权限

3.1. 包访问权限

包访问权限意味着对当前包中的所有其他类都可见
但是包之外的所有类,都没有这个成员的访问权限

因而希望取得某成员的访问权,我们只有几个途径:

  1. public声明
  2. 不加访问权限修饰词,将其他类至于同一个包中
  3. protected声明,继承此类的子类可以访问
  4. 对于private声明,提供访问器(getter)和修改器(setter)方法
    使得其他类可以通过这两个方法访问
    OOP中最优雅的方式

3.2. public: 接口访问权限

public关键字修饰成员,表示其对每个人都是可用的

3.3. private: 你无法访问

private关键字修饰成员
表示除了成员所示类之外,其他任何类都无法访问

使用场景举例:

  1. 控制类的对象的创建
    显示定义构造器,并将其声明为private
    此时我们可以通过提供一个public的静态方法来创建对象
    这有利于我们控制对象的创建
    (还会组织对于此类的继承)
  2. "助手"方法
    如果一个方法,我们确定它只会被用于辅助类中的别的方法
    我们可以将它指定为private
    可以组织我们在包内的其他地方对其进行误用
  3. 域一般应该指定为private
    通过提供public方法来访问域
    使得我们可以控制对域的访问
    除非需要公开底层的实现细节(不太常见),否则一般推荐将所有域都指定为private

3.4. protected: 继承访问权限

protected关键字修饰成员
主要用于处理集成概念
说明这个成员对于继承的子类是可见的
此外,还提供包访问权限

4. 接口和实现

4.1. 封装

对访问权限的控制,常被称为具体实现的隐藏
将数据和方法包装进类中,以及具体是实现的隐藏,常共同被称为封装
结果是得到的同时带有特征和行为数据类型

访问权限控制将权限控制于数据类型的内部
两个重要原因:

  1. 要设定代码中,可以被使用和不可以被使用的界限
    一般我们称使用者为客户端程序员
  2. 接口和具体实现进行分离
    如果我们限制客户端程序员除了向接口发送信息之外不可以进行别的操作
    那么我们可以在不破坏客户端代码的情况下
    随意修改任何不是public的东西(也就是接口之外的东西)

常用的实践模式:
public成员至于开头
随后耕者protected、包访问权限、private成员
这样便于类的使用者抓住重点
因为这样他们只需要阅读public部分,也就是他们需要同时也是可以访问的部分

5. 类的访问权限

不同于类的成员
类的访问权限只有两种public包访问权限

5.1. 部分额外限制

  1. 每个编译单元只能有一个public
  2. public类的必须完全与其所处的编译单元的文件名相同
    包括大小写
  3. 编译单元内可以不带public类(不常用)

5.2. 作用

确保客户端程序员只使用我们希望提供给外部使用的类
而非我们可能知识用于内部实现,或者后续很可能更改或删除的类

5.3. 一些特殊用法

如果我们不希望其他任何人拥有某个类的访问权限
我们可以将其所有的构造器都指定为private
如此,除了该类static成员内可以创建
其他任何人都无法创建该类的对象

这种操作有几种可能的用途:

  1. 返回引用之前对对象做一些额外的工作
  2. 记录对象的创建次数,可以限制对象的数量

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

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

相关文章

reconic 天空 模型

目录 推理代码: EnvLight 代码: 推理代码: sky_model self.models["Sky"]outputs["rgb_sky"] sky_model(image_info)outputs["rgb_sky_blend"] outputs["rgb_sky"] * (1.0 - outputs["opa…

从服务器多线程批量下载文件到本地

1、客户端安装 aria2 下载地址:aria2 解压文件,然后将文件目录添加到系统环境变量Path中,然后打开cmd,输入:aria2c 文件地址,就可以下载文件了 2、服务端配置nginx文件服务器 server {listen 8080…

C++ | 可变模板参数

1. 为什么需要可变模板参数? 在C11之前,若想实现一个接受任意数量参数的函数,只能依赖va_list等C风格可变参数,但这种方式类型不安全且难以调试。例如printf函数: printf("%d %f %s", 10, 3.14, "hel…

【机器学习】每日一讲-朴素贝叶斯公式

文章目录 **一、朴素贝叶斯公式详解****1. 贝叶斯定理基础****2. 从贝叶斯定理到分类任务****3. 特征独立性假设****4. 条件概率的估计** **二、在AI领域的作用****1. 文本分类与自然语言处理(NLP)****2. 推荐系统****3. 医疗与生物信息学****4. 实时监控…

AI Agents系列之AI代理的类型

在本文中,我们将探讨不同类型的 AI 代理,包括它们的实现、实际应用、优势和局限性。从简单反射代理到多代理系统,我们将了解这些模型如何推动自动化、决策制定和智能问题解决。 文章目录 1. AI代理的类型1.1 简单反射代理1.1.1 实现**1.1.2 优势****1.1.3 局限性**1.2 基于…

C# --- IEnumerable 和 IEnumerator

C# --- IEnumerable 和 IEnumerator IEnumerableIEnumeratorIEnumerable 和 IEnumerator 的作用手动实现 IEnumerableIEnumerable vs. IQueryable为什么有了ienumerator还需要ienumerable IEnumerable 在C#中,IEnumerable 是一个核心接口,用于表示一个可…

镜舟科技助力某大型电网企业破解数据架构升级难题,打造国产化湖仓标杆

在 “十四五” 规划全面推进国产化替代的背景下,某大型电网企业联合镜舟科技与腾讯云,基于全球领先的开源分析型数据库 StarRocks 及腾讯 TBDS 大数据平台,构建电力行业国产化湖仓一体架构。该项目实现 PB 级电力数据的统一管理,为…

Spark-SQL核心编程3

数据加载与保存 通用方式: SparkSQL 提供了通用的保存数据和数据加载的方式。这里的通用指的是使用相同的API,根据不同的参数读取和保存不同格式的数据,SparkSQL 默认读取和保存的文件格式为parquet 数据加载方法: spark.read.lo…

使用HTML + CSS + JS,编写一个台球追分计分器

目录 一.代码 二.效果展示 三.该计分器的优点 一.代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

LLM小白自学笔记:1.两种指令微调

一、LoRA 简单来说&#xff0c;LoRA不直接调整个大模型的全部参数&#xff08;那样太费资源&#xff09;&#xff0c;而是在模型的某些层&#xff08;通常是注意力层&#xff09;加个“旁路”——两个小的矩阵&#xff08;低秩矩阵&#xff09;。训练时只更新这俩小矩阵&#x…

2026《数据结构》考研复习笔记一(C++基础知识)

C基础知识复习 一、数据类型二、修饰符和运算符三、Lambda函数和表达式四、数学函数五、字符串六、结构体 一、数据类型 1.1基本类型 基本类型 描述 字节&#xff08;位数&#xff09; 范围 char 字符类型&#xff0c;存储ASCLL字符 1&#xff08;8位&#xff09; -128…

基于骨骼识别的危险动作报警分析系统

基于骨骼识别的危险动作报警分析系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】基于骨骼识别算法的实时危险行为预警方案 【技术栈】 ①&#xff1a;系统环境&#xff1a;Windows 10/11、macOS Ventura、Ubuntu 20.04 ②&#x…

【双指针】四数之和(medium)

四数之和&#xff08;medium&#xff09; 题⽬描述&#xff1a;解法&#xff08;排序 双指针&#xff09;算法思路&#xff1a; C 算法代码&#xff1a;Java 算法代码&#xff1a; 题⽬链接&#xff1a;18. 四数之和 题⽬描述&#xff1a; 给你⼀个由 n 个整数组成的数组 num…

Flask+Influxdb+grafna构建电脑性能实时监控系统

Influx下载地址&#xff0c;这里下载了以下版本influxdb-1.8.5_windows_amd64.zip 运行前需要先启动Influx数据库&#xff1a; 管理员方式运行cmd->F:->cd F:\influxdb\influxdb-1.8.5-1->influxd -config influxdb.conf&#xff0c;以influxdb.conf配置文件启动数…

如何在Keil中配置国民技术N32G系列MCU开发环境

如何在Keil及Jlink中搭建国民技术N32G系列MCU开发环境 根据自己的MCU型号&#xff08;我这里的型号是N32G452REL7&#xff09;访问国民技术官网&#xff0c;依次从N32G通用MCU-技术资源-固件和软件-软件开发套件&#xff0c;获取对应MCU型号的SDK&#xff0c;也可点击这里从网盘…

微软承认Win11出现极端错误,只能强制关机或重装系统

最近&#xff0c;不少使用 Windows 11 的用户反映&#xff0c;在系统更新后&#xff0c;“Windows Hello”突然失效&#xff0c;原本便捷的人脸识别和PIN登录功能统统无法使用。更糟的是&#xff0c;有人在重置系统后直接被挡在系统门外&#xff0c;这让人不禁发问&#xff1a;…

【android bluetooth 协议分析 02】【bluetooth hal 层详解 1】【uart 介绍】

一、什么是 UART&#xff1f; UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09; 是一种 串行通信协议&#xff0c;它的特点是通信时不需要专门的时钟信号&#xff08;叫做“异步”通信&#xff09;&#xff0c;常用于两个设备之间的简单数据通信&…

天元证券|奶粉行业结构性回暖 乳企竞速全龄化、国际化

在过去几年中&#xff0c;中国婴配粉市场经历了量价齐增&#xff0c;量减价增&#xff0c;量减价减的三个周期。历经多年行业深度洗牌与竞争格局重塑&#xff0c;2024年中国婴配粉市场回暖态势愈发清晰可辨。 日前&#xff0c;包括中国飞鹤、澳优、健合集团在内的多家奶粉股披露…

第3.1节 调用链路分析简介

调用链路&#xff08;Call Chain / Call Path&#xff09; 是程序在执行过程中&#xff0c;按照调用顺序形成的函数、模块或组件之间的依赖关系链条&#xff0c;完整记录了从程序入口到当前执行点的动态调用路径。它反映了代码执行的逻辑流程&#xff0c;是分析程序行为、调试问…

System.Security.Cryptography.CryptographicException“填充无效,无法被移除。”

这个异常通常发生在以下几种情况&#xff1a; 1.密文损坏&#xff1a;密文在传输或存储过程中被篡改或损坏。 2.密钥不匹配&#xff1a;用于解密的密钥与加密时使用的密钥不同。 3.填充模式不匹配&#xff1a;加密时使用的填充模式与解密时指定的填充模式不一致。 4.使用了不正…