java面试题02访问修饰符有哪些?区别是什么?

访问修饰符是面向对象编程中实现封装的核心机制,用于控制类、属性、方法等成员的可见性(可访问范围)。不同的访问修饰符决定了其他类或代码在何处可以访问这些成员。

主要的访问修饰符及其区别如下(以 Java 和 C# 为代表,其他语言类似但可能有细微差异):

主要访问修饰符

  1. public (公共的)

    • 可见性范围: 最广。任何地方都可以访问(同一个包/命名空间内、不同包/命名空间内、其他程序集内)。
    • 用途: 定义类的公共接口(API),暴露给外部使用者。通常用于类本身(如果允许外部实例化)、构造方法、以及希望被广泛调用的核心方法或常量属性。
    • 示例:
      public class MyClass {public int publicField; // 任何地方都能读写public void publicMethod() { ... } // 任何地方都能调用
      }
      
  2. protected (受保护的)

    • 可见性范围:
      • 同一个类内部。
      • 同一个包/命名空间内部(Java 特有,C# 的 protected 默认不包括同一命名空间)。
      • 子类内部(无论子类在哪个包/命名空间)。这是 protected 最核心的含义。
    • 用途: 允许类将成员暴露给其子类,用于继承和扩展。通常用于需要被子类覆盖或直接使用的方法和属性,但不希望完全公开给外部。
    • 示例:
      public class Parent {protected int protectedField; // 子类和同包类可访问protected void protectedMethod() { ... } // 子类和同包类可调用
      }
      public class Child extends Parent {public void useProtected() {protectedField = 10; // 子类内部可直接访问父类的protected成员protectedMethod();   // 子类内部可直接调用父类的protected方法}
      }
      
  3. default (包私有 / 内部 - Java) / internal (内部 - C#)

    • Java (default - 无关键字):
      • 可见性范围: 同一个包(package)内部。同一个包内的类可以访问,包外的类(即使是子类)不能访问。
      • 用途: 实现包级别的封装,用于包内协作但不希望包外访问的成员。
      • 示例 (Java):
        class PackagePrivateClass { // 没有 public, 默认 defaultint defaultField; // 默认 default,同包可见void defaultMethod() { ... } // 默认 default,同包可见
        }
        
    • C# (internal):
      • 可见性范围: 同一个程序集(Assembly)内部。同一个项目(编译单元)内的类可以访问,不同程序集(如引用的DLL)中的类不能访问。
      • 用途: 实现组件或模块内部的封装,用于内部协作的成员,不暴露给外部使用者。
      • 示例 (C#):
        internal class InternalClass {internal int InternalField; // 同程序集可见internal void InternalMethod() { ... } // 同程序集可见
        }
        
  4. private (私有的)

    • 可见性范围: 最小,仅限于定义它的类(或结构体、枚举)内部。即使是同一个包/程序集内的其他类,或者它的子类,都不能直接访问。
    • 用途: 实现最严格的封装。用于隐藏类的实现细节(内部状态、辅助方法),只允许类自身的方法进行操作。这是保证数据安全性和一致性的关键手段。字段(属性背后的数据)通常应声明为 private,然后通过 publicprotected 的属性(getter/setter)或方法来提供受控的访问。
    • 示例:
      public class MyClass {private int privateField; // 只有MyClass内部的方法能访问private void privateHelperMethod() { ... } // 只有MyClass内部的方法能调用public void publicMethod() {privateField = 5; // 类内部方法可以访问private成员privateHelperMethod();}
      }
      // 外部代码尝试访问会编译错误
      // MyClass obj = new MyClass();
      // obj.privateField = 10; // 错误!
      // obj.privateHelperMethod(); // 错误!
      

访问范围总结表 (以 Java 为例)

修饰符当前类内部同一个包 (Package) 内部不同包的子类不同包的非子类
public
protected
default
private

C# 注意点:

  • protected 在 C# 中默认不包括同一命名空间内的其他类(只包括自身和子类)。如果需要 Java protected 的语义(自身+子类+同程序集),C# 提供了 protected internalprotectedinternal 满足其一即可访问)。
  • internal 是 C# 对应 Java default 包可见性的概念,但作用域是程序集而非包。

关键区别与设计原则

  1. 封装性控制: private 提供最强封装,public 最弱。选择哪种修饰符本质上是决定“谁有权知道和操作这个成员”。
  2. 信息隐藏: 使用 private 隐藏实现细节(如字段、内部状态、复杂算法的辅助方法),只通过 public/protected 方法暴露必要的、定义良好的接口(API)。这是 OOP 设计的基石。
  3. 安全性: 防止外部代码随意修改对象内部状态(尤其是 private 字段),保证对象状态的有效性和一致性(例如,通过 private setter 进行数据验证)。
  4. 灵活性与可维护性: 隐藏内部实现后,只要公共接口不变,内部实现的修改(如优化算法、改变数据结构)不会影响使用该类的代码,提高了代码的可维护性和可扩展性。
  5. 继承与扩展: protected 修饰符是专门为继承设计的,允许基类向子类暴露一些内部能力或状态,支持“白盒复用”,同时仍对非继承体系外的代码隐藏。

最佳实践建议

  • 字段优先 private 几乎总是将字段声明为 private,然后通过公共的属性(Property - C#)Getter/Setter 方法(Java) 来提供访问(可以在其中加入验证逻辑)。
  • 方法按需选择:
    • public: 类的主要功能、对外提供的服务。
    • protected: 供子类覆盖或调用的方法(模板方法模式常用)。
    • private: 内部辅助方法、实现细节。
    • default/internal: 包内/程序集内协作的辅助方法或类,不对外公开。
  • 类本身: 通常用 public(可被外部实例化)或 default/internal(仅包内/程序集内使用)。极少用 private/protected(嵌套类常用)。

理解并正确使用访问修饰符是编写健壮、可维护、符合面向对象设计原则代码的关键一步。 它直接体现了“什么该暴露,什么该隐藏”的设计决策。

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

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

相关文章

在小程序中实现上下左右拖动表格

在小程序的开发中,不可避免会出现上下左右拖动表格的类似需求,下面将把这个简单实现一下 其中主要使用到了overflow: scroll;来使得横向和纵向可以滚动,并且使用负边距 父容器截断的方法来同时隐藏横向和纵向滚动条,从而实现该效…

[MSPM0开发]之九 MSPM0G3507的ADC

[MSPM0开发]之九 MSPM0G3507的ADC 一、 MSPM0G3507 ADC概述二、 MSPM0G3507 ADC系统框图2.1 电压基准2.2 分辨率2.3 硬件均值计算2.4 采样触发源和采样模式2.5 转换模式2.6 转换结果数据格式2.7 高级特性2.7.1 非FIFO模式下的ADC操作(单次转换和重复单次转换&#x…

门锁开关;与我们生活中紧密联系!

门锁开关作为日常生活的核心安全组件,其设计与应用直接影响家居安全、使用便捷性及设备寿命,以下是其关键价值与技术要点的系统分析: 🔒 ‌一、基础功能:安全与便利的平衡‌ ‌物理防护核心‌ ‌锁体结构‌&#xff1…

WRF-Hydro分布式水文模型:洪水预报、水资源管理与规划、生态水文研究、气候变化影响评估、流域综合管理、水电工程规划与运行

目录 第一部分:WRF-Hydro模型功能及运行流程、依赖库准备 第二部分:WRF-Hydro模式编译、离线运行及案例实践 第三部分:结合多案例进行模式数据制备及实践应用 【内容简述】: WRF-Hydro模型是一个分布式水文模型,‌…

OCRBench:评估多模态大模型的OCR能力

论文地址:OCRBench: On The Hidden Mystery of OCR In Large Multimodal Models:2305.07895 OCRBench在10个文本相关任务上测评多模态大模型(LMM)的OCR能力,包含1000个问题-答案对,每个问题-答案对包含以下…

servlet前后端交互

前后端交互目录 servlet流程servlet请求JSON格式实现表格效果完整代码 servlet流程 流程图: 客户端(浏览器): 技术栈:使用 jQuery Ajax 发起异步请求。请求配置: 请求路径:指定目标Servlet的…

4. 时间序列预测的自回归和自动方法(2)

ar_model.AutoReg 模型通过应用以下元素来估计参数 条件最大似然(CML)估计量:这是一种涉及条件对数似然函数最大化的方法,据此认为已知的参数要么由理论假设固定,要么更常见地由估计值代替(LewiseBeck&…

MySQL(84)如何配置MySQL防火墙?

MySQL防火墙(MySQL Enterprise Firewall)是一种MySQL企业版特性,用于保护数据库免受SQL注入和其他恶意活动的攻击。它通过学习和监控合法SQL语句,创建一个允许列表,从而阻止未在列表中的SQL语句。 1. 启用MySQL防火墙…

优化 Python 爬虫性能:异步爬取新浪财经大数据

一、同步爬虫的瓶颈 传统的同步爬虫(如requestsBeautifulSoup)在请求网页时,必须等待服务器返回响应后才能继续下一个请求。这种阻塞式I/O操作在面对大量数据时存在以下问题: 速度慢:每个请求必须串行执行&#xff0…

Visual Studio Code (VSCode) Python 开发环境配置完整指南

一、安装准备 1. 安装 VSCode 官网下载: Visual Studio Code - Code Editing. Redefined安装时建议勾选: "添加到PATH" (方便终端调用)"注册为受支持的文件类型编辑器"2. 安装 Python 官网下载: Download Python | Python.org安装时勾选: "Add Pytho…

智能数据标签引擎:企业级分类分级与动态管控实践

在数字化转型浪潮中,企业数据量呈爆发式增长,数据的多样性和复杂性也不断提升。如何对海量数据进行高效分类分级,并实施动态管控,成为企业释放数据价值、保障数据安全的关键挑战。智能数据标签引擎应运而生,它通过引入…

Redis(1)——RDB持久化

在追求极致性能的 Redis 世界里,数据安全是永恒的主题。作为内存数据库,Redis 重启或宕机意味着数据丢失的风险。RDB (Redis Database) 持久化,又称快照持久化,是 Redis 提供的最经典、最高效的数据落地方案之一。它通过生成某个时…

深度剖析无感刷新Token:领码SPARK平台赋能微服务认证的智能实践

摘要 在现代微服务架构与数字化转型大潮中,用户身份认证的连续性与安全性尤为关键。无感刷新Token技术通过智能的双Token机制,确保用户访问凭证在不打扰用户的前提下自动续期,避免因Token过期导致的频繁登录中断。本文结合领码SPARK融合平台的…

声网对话式 AI:开启我的编程进阶之旅

转行学习编程时,复杂的代码逻辑常让我无从下手,直到遇见声网对话式AI。它像一位耐心的导师,不仅用通俗易懂的语言帮我理解Python循环嵌套等难点,还提供实际代码示例。当我开发学生成绩管理系统时,它甚至直接生成框架代…

精准护理,点亮进行性核上性麻痹患者生活希望

进行性核上性麻痹(PSP)是一种罕见的神经系统变性疾病,主要表现为姿势平衡障碍、眼球运动障碍、吞咽困难等症状。科学的健康护理能有效延缓病情进展,提升患者生活质量,可从以下方面着手。 ​在饮食护理上,因…

记录一次 Oracle 表空间不足问题的解决过程

记录一次 Oracle 表空间不足问题的解决过程 6月14日,某医院信息科用户反映无法提交门诊病例,门诊处方也无法开立。其他功能是正常的。考虑可能是与门诊病例有关的表空间用完了。 Oracle表空间的数据文件默认是可以自动增长的,但是单个文件的…

2024 年 11 月公链行业研报:比特币创历史新高引领市场全面上涨

比特币屡创历史新高,主导市场全面上涨,同时 Layer 1 表现强劲,而 Layer 2 格局持续演变。 2024 年 11 月公链研报 作者:Stella L (stellafootprint.network) 数据来源:Footprint Analytics 公链研究页面 2024 年 11…

MAX4622ESE+T双5Ω模拟开关在低失真音频路由中的实测:0.5Ω匹配度如何改善THD性能

一、产品概述:精密信号切换的硬件基石 MAX4622ESET是一款双通道SPDT(单刀双掷)模拟开关,采用5Ω超低导通电阻设计(典型值3Ω),专为高精度信号路由场景优化。其核心价值在于通过单片CMOS架构实现…

高并发秒杀系统(Redis分布式锁优化与库存防超卖实战)

本文通过日活百万级的电商秒杀案例,深度剖析分库分表路由算法在高并发场景下的落地实践。结合Redis分布式锁的优化方案解决库存超卖问题,包含完整架构设计、代码实现及压测数据对比。全文包含12个核心代码片段和8类技术图表,来自线上生产环境…

从loader和plugin开始了解webpack

目录 一、webpack中loader和plugin的区别1. Loader(每个 Loader 是一个函数或对象)2.plugin(每个 Plugin 是一个实例)3.自定义loader和plugin 二、Babel的功能三、Plugin中的compiler和compilation对象1. compiler对象2. compilat…