Java基础访问修饰符全解析

一、Java 访问修饰符概述

Java 中的访问修饰符用于控制类、方法、变量和构造函数的可见性和访问权限,主要有四种:public、protected、default(无修饰符)和 private。

Java 的访问修饰符在编程中起着至关重要的作用,它们决定了类、方法、变量和构造函数在不同场景下的可见性和可访问性。以下分别介绍这四种主要的访问修饰符:

1. public 访问修饰符

public 修饰符是访问权限最宽松的修饰符,表示任何类都可以访问被修饰的类或类成员。无论这个类位于哪个包中,public 成员始终对所有其他类可见。

  • :当一个类被声明为 public 时,任何其他类都可以访问这个类。
  • 字段、方法、构造器:声明为 public 的字段、方法或构造器可以被任何类访问,不受包和继承关系的限制。

例如:

 

// 文件:Animal.java

package com.example;

public class Animal{

public String name;

public void makeSound(){

System.out.println("Animal makes a sound");

}

}

在这个例子中,Animal 类和它的 name 字段以及 makeSound () 方法都被声明为 public,因此任何其他包中的类都可以访问它们。

public 修饰符适用于公共 API 和工具类。当类或方法需要暴露给整个应用程序或多个模块时,public 是理想的选择。比如 Java 中的 Math 类的静态方法通常是 public,因为这些方法是通用工具,需要在多个地方调用。

2. private 访问修饰符

private 修饰符是访问权限最严格的修饰符。使用 private 修饰的成员只能在类内部访问,类的外部(包括其子类)无法访问。

  • :类不能被声明为 private,Java 不允许使用 private 修饰符来限制类的访问权限。
  • 字段、方法、构造器:声明为 private 的字段、方法或构造器仅在声明它们的类内部可见,其他类无权访问。

例如:

 

// 文件:Person.java

package com.example;

public class Person{

private String ssn;// 社会安全号码 (私密数据)

private void displaySsn(){

System.out.println("SSN: "+ ssn);

}

public void setSsn(String ssn){

this.ssn = ssn;

}

}

在这个例子中,ssn 字段和 displaySsn () 方法都是 private,所以它们只能在 Person 类内部被访问。其他类无法直接读取或修改 ssn,只能通过 setSsn () 这样的 public 方法进行控制。

private 修饰符适用于信息隐藏和确保安全性。当类中的某些数据或实现细节不希望被外部访问或修改时,使用 private 是最佳选择,确保了数据封装。敏感数据如密码、个人信息等应使用 private 修饰符,以防止被意外或恶意篡改。

3. protected 访问修饰符

protected 修饰符允许类的成员在同一包内或继承关系中的子类中访问。与 private 不同的是,protected 使得子类可以访问父类的受保护成员。

  • :类不能声明为 protected。
  • 字段、方法、构造器:声明为 protected 的成员在同一个包内的所有类中可见,此外,子类也可以访问它们。

例如:

 

// 文件:Animal.java

package com.example;

public class Animal{

protected String species;

protected void displaySpecies(){

System.out.println("Species: "+ species);

}

}

// 文件:Dog.java

package com.example;

public class Dog extends Animal{

public void showSpecies(){

this.species = "Canine";// 访问 protected 成员

this.displaySpecies();// 访问 protected 方法

}

}

在这个例子中,Animal 类的 species 字段和 displaySpecies () 方法是 protected 的,Dog 作为其子类可以访问这些成员。

protected 修饰符适用于继承和扩展。当希望类的某些成员能被子类继承和使用,但不希望被完全公开时,使用 protected 是合适的选择。

4. default(无修饰符,包访问权限)

如果在类或成员声明时未显式指定访问修饰符,则默认为包级访问权限。这种访问权限仅限于同一包内的类,包外的类无法访问它们。

  • :如果类没有显式声明为 public,它就具有包级访问权限,仅对同一包内的类可见。
  • 字段、方法、构造器:默认修饰符允许同包中的类访问这些成员,但包外的类和子类都无法访问。

例如:

 

// 文件:Animal.java

package com.example;

class Animal{

String name;

void makeSound(){

System.out.println("Animal makes a sound");

}

}

// 文件:Test.java

package com.example;

public class Test{

public static void main(String[] args){

Animal animal = new Animal();

animal.name = "Lion";// 同一包内,访问包级成员

animal.makeSound();

}

}

在这个例子中,Animal 类和它的成员没有访问修饰符,因此只能在 com.example 包内被访问。Test 类可以访问 Animal,但位于其他包中的类将无法访问 Animal。

默认访问权限适用于包内共享。当类或成员只需要在同一个包中共享时,可以使用默认访问权限。

二、四种访问修饰符详解

1. public

  1. 作用:表示被修饰的类、方法、变量或构造函数可以被任何其他类访问。

public 修饰符是访问权限最宽松的修饰符,无论类位于哪个包中,被 public 修饰的类或类成员始终对所有其他类可见。比如一个被声明为 public 的类,任何其他类都可以访问这个类;声明为 public 的字段、方法或构造器可以被任何类访问,不受包和继承关系的限制。

  1. 可见性:同一类内可见、同一包内可见、不同包中的子类可见、不同包中的非子类可见。

在同一类内,自然可以访问 public 修饰的成员;在同一包内,其他类也能访问 public 修饰的成员;不同包中的子类和非子类同样可以访问 public 修饰的成员。

2. protected

  1. 作用:表示被修饰的成员可以被同一包内的类和不同包中的子类访问。

protected 修饰符允许类的成员在同一包内或继承关系中的子类中访问。与 private 不同,protected 使得子类可以访问父类的受保护成员。例如,父类中的 protected 成员在同一包内的所有类中可见,此外,不同包中的子类也可以访问这些成员。

  1. 可见性:同一类内可见、同一包内可见、不同包中的子类可见、不同包中的非子类不可见。

在同一类内,protected 成员是可见的;在同一包内,所有类都可以访问 protected 成员;不同包中的子类可以访问父类的 protected 成员,但不同包中的非子类无法访问。

3. default(无修饰符)

  1. 作用:如果不指定任何访问修饰符,则默认为 default,也称为包级私有。

默认情况下,如果在类或成员声明时未显式指定访问修饰符,就具有包级访问权限。这种访问权限仅限于同一包内的类,包外的类无法访问它们。

  1. 可见性:同一类内可见、同一包内可见、不同包中的子类不可见、不同包中的非子类不可见。

在同一类内,无修饰符的成员可见;在同一包内,其他类可以访问无修饰符的成员;但不同包中的子类和非子类都无法访问这些成员。

4. private

  1. 作用:表示被修饰的成员只能在它所在的类内访问。

private 修饰符是访问权限最严格的修饰符。使用 private 修饰的成员只能在类内部访问,类的外部(包括其子类)无法访问。

  1. 可见性:同一类内可见、同一包内不可见、不同包中的子类不可见、不同包中的非子类不可见。

只有在声明它们的类内部,private 修饰的成员才可见,同一包内的其他类、不同包中的子类以及非子类都无法访问。

三、不同访问修饰符的使用场景

1. public

  1. 适用于需要在多个包中访问的类和实例变量。
    • 当一个类或方法需要被不同包中的多个类访问时,使用 public 修饰符是最合适的选择。例如在设计一个通用的工具类时,可能希望它能够被整个项目中的任何地方调用,这时就可以将工具类声明为 public。如 CSDN 博客中提到的:“public 是最宽松的访问级别,允许类、方法或变量被任何其他类访问。当你希望一个方法或变量可以被任何地方调用或访问时,应使用 public。”
    • 如果一个成员声明为 public,则它对其他所有的类和对象都是可见的。在不同包中的非子类和子类都可以访问 public 修饰的成员,具有最广泛的可见性。
  1. 如果一个成员声明为 public,则它对其他所有的类和对象都是可见的。
    • public 修饰的类、方法、变量或构造函数在同一类内可见、同一包内可见、不同包中的子类可见、不同包中的非子类可见。这意味着无论在哪个位置,只要能够访问到该类所在的包,就可以访问到被 public 修饰的成员。

2. protected

  1. 适用于需要在子类中访问的变量和方法。
    • 在设计类的继承结构时,如果某些变量或方法需要被子类访问,但又不希望被其他包中的非子类访问,那么可以使用 protected 修饰符。CSDN 博客中提到:“当一个变量或方法需要被子类访问但不想让包外的其他类访问时,使用 protected。”
    • 例如在一个父类中定义了一些受保护的方法,子类可以在不同的包中继承并访问这些方法,实现特定的功能扩展。
  1. 如果一个成员声明为 protected,则它对它所在的类、它所在的包内的所有类以及它的子类都是可见的。
    • protected 修饰的成员在同一类内可见、同一包内可见、不同包中的子类可见、不同包中的非子类不可见。这体现了 protected 修饰符在继承关系中的特殊作用,既保证了一定的封装性,又允许子类进行适当的访问和扩展。

3. default(包访问权限)

  1. 适用于同一个包中的所有类和方法。
    • 当类或方法只需要在同一个包内共享时,可以使用默认访问权限,即不使用任何修饰符。CSDN 博客中提到:“当一个变量或方法只需要在同一个包内的类之间共享时,可以不使用任何访问修饰符。”
    • 例如在一个项目中,某些辅助类或方法只在特定的包内使用,不需要对外暴露,这时使用默认访问权限可以避免不必要的访问,提高代码的封装性。
  1. 如果一个成员没有被定义为 public、protected 或 private,它将具有默认访问权限,即同样包中的所有类和方法都可以访问它。
    • 默认访问权限的成员在同一类内可见、同一包内可见、不同包中的子类不可见、不同包中的非子类不可见。这种访问权限限制在同一个包内,有助于将实现细节限制在特定的范围内,保持代码的整洁和组织。

4. private

  1. 适用于需要在本类中使用的变量和方法。
    • 当类中的某些数据或实现细节不希望被外部访问或修改时,使用 private 修饰符是最佳选择。CSDN 博客中提到:“private 是最严格的访问级别,仅允许同一类内部访问。用于封装类的内部状态,防止外部类直接修改这些状态。”
    • 例如在一个类中,可能有一些敏感数据或内部实现的方法,只在本类内部使用,不希望被其他类访问,这时就可以使用 private 修饰符进行封装。
  1. 如果一个成员声名为 private,则它只对当前类内部可见。外部类以及任何继承类都不能访问该成员。
    • private 修饰的成员仅在同一类内可见,同一包内不可见、不同包中的子类不可见、不同包中的非子类不可见。这种严格的访问限制确保了类的内部实现细节不被外部随意访问,实现了良好的封装。

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

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

相关文章

安心护送转运平台小程序

安心护送转运平台小程序是一款基于FastAdminThinkPHPUniapp开发的非急救救护车租用转运平台小程序系统,可以根据运营者的业务提供类似短途接送救护服务,重症病人转运服务,长途跨省护送服务。

人工智能技术在外骨骼机器人中的应用,发展历程与原理介绍

大家好,我是微学AI,今天给大家介绍一下 人工智能技术在外骨骼机器人中的应用,发展历程与原理介绍 。外骨骼机器人是一种 套在人体外部的可穿戴机器人装置 ,旨在增强人类的身体能力和运动功能。其独特之处在于能够与人体紧密配合&a…

类型转换与IO流:C++世界的变形与交互之道

文章目录 前言🎄一、类型转换🎈1.1 隐式类型转换🎈1.2 显式类型转换🎁1. C 风格强制类型转换🎁2. C 类型转换操作符 🎈1.3 C 类型转换操作符详解🎁1. static_cast🎁2. dynamic_cast&…

如何手搓一个智能宠物喂食器

背景 最近家里的猫胖了,所以我就想做个逗猫棒。找了一圈市场上的智能逗猫棒,运行轨迹比较单一,互动性不足。 轨迹单一,活动范围有限 而我希望后续可以结合人工智能物联网,通过摄像头来捕捉猫的位置,让小…

【AI系统】AI 编译器基本架构

AI 编译器基本架构 在上一篇文章中将 AI 编译器的发展大致分为了 3 个阶段,分别为 1)朴素编译器、2)专用编译器以及 3)通用编译器。 本文作为上一篇文章 AI 编译器架构的一个延续,着重讨论 AI 编译器的通用架构。首先…

用 React 编写一个笔记应用程序

这篇文章会教大家用 React 编写一个笔记应用程序。用户可以创建、编辑、和切换 Markdown 笔记。 1. nanoid nanoid 是一个轻量级和安全的唯一字符串ID生成器,常用于JavaScript环境中生成随机、唯一的字符串ID,如数据库主键、会话ID、文件名等场景。 …

#渗透测试#红蓝攻防#HW#漏洞挖掘#漏洞复现01-笑脸漏洞(vsftpd)

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…

Day1——GitHub项目共同开发

MarkDowm解释 Markdown是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML代码。Markdown的目的是让文档的编写和阅读变得更加容易,同时也不失HTML的强大功能。以下是Markdown的一些基本概念和用法&a…

【攻防世界】WEB-inget

首先找到该关卡 启动靶场环境 访问靶场 构造一个id参数,尝试访问,无内容回显 使用sqlmap工具,先获取数据库,输入命令sqlmap -u http://61.147.171.105:58893/?id1 --dbs 发现第一个即为所需数据库,接下来进行获取…

【C++】深度剖析经典编程题目:电影票、A+B与鸡兔同笼的解决方案

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯牛牛买电影票问题题目描述解题思路代码实现优化思路总结 💯AB问题题目描述解题思路代码实现代码优化总结 💯鸡兔同笼问题题目描述解题思路数学解法代…

掌上单片机实验室 — RT - Thread+ROS2 浅尝(26)

前面化解了Micro_ROS通讯问题,并在 RT-Thread Studio 环境下,使用Micro_ROS软件包中的例程,实现了STM32F411CE核心板和ROS2主机的通讯。之后还尝试修改例程 micro_ros_sub_twist.c ,实现了接收 turtle_teleop_key 所发出的 turtle…

How to monitor Spring Boot apps with the AppDynamics Java Agent

本文介绍如何使用 AppDynamics Java 代理监视 Azure Spring Apps 中的 Spring Boot 应用程序。 使用 AppDynamics Java 代理可以: 监视应用程序使用环境变量配置 AppDynamics Java 代理 在 AppDynamics 仪表板中检查所有监视数据 How to monitor Spring Boot app…

ComfyUI | ComfyUI桌面版发布,支持winmac多平台体验,汉化共享等技巧!(内附安装包)

ComfyUI 桌面版正式推出,支持 Windows 与 macOS 等多平台,为 AI 绘画爱好者带来全新体验。其安装包便捷易用,开启了轻松上手之旅。汉化共享功能更是一大亮点,打破语言障碍,促进知识交流与传播。在操作上,它…

CAD深度清理工具-AVappsDrawingPurge9.0.0(2024.8.27版本) 支持版本CAD2022-2025-供大家学习研究参考

图形文件DWG体积很大:通常没有明显的数据。同时,还其他症状包括: (1)无法复制和粘贴图元。 (2)悬挂较长时间选择文本与 “特性”选项板上打开。 (3)图形文件需要很长时间…

鸿蒙Next星河版基础用例

目录: 1、鸿蒙箭头函数的写法2、鸿蒙数据类型的定义3、枚举的定义以及使用4、position绝对定位及层级zIndex5、字符串的拼接转换以及数据的处理(1)字符串转数字(2)数字转字符串(3)布尔值转换情况(4)数组的增删改查 6、三元表达式7、鸿蒙for循环的几种写法7.1、基本用…

Spring的事务管理

tx标签用于配置事务管理用于声明和配置事务的相关属性 transaction-manager指定一个事务管理器的引用,用于管理事务的生命周期。propagation指定事务的传播属性,决定了在嵌套事务中如何处理事务。isolation指定事务的隔离级别,用于控制事务之…

华为新手机和支付宝碰一下 带来更便捷支付体验

支付正在变的更简单。 11月26日,华为新品发布会引起众多关注。发布会上,华为常务董事余承东专门提到,华为Mate 70和Mate X6折叠屏手机的“独门支付秘技”——“碰一下”,并且表示经过华为和支付宝的共同优化,使用“碰…

ADS学习笔记 7. 超外差接收机设计

基于ADS2023 update2 更多ADS学习笔记:ADS学习笔记 1. 功率放大器设计ADS学习笔记 2. 低噪声放大器设计ADS学习笔记 3. 功分器设计ADS学习笔记 4. 微带分支定向耦合器设计ADS学习笔记 5. 微带天线设计ADS学习笔记 6. 射频发射机设计 目录 -1、射频接收机性能指标…

蓝牙定位的MATLAB程序,四个锚点、三维空间

这段代码通过RSSI信号强度实现了在三维空间中的蓝牙定位,展示了如何使用锚点位置和测量的信号强度来估计未知点的位置。代码涉及信号衰减模型、距离计算和最小二乘法估计等基本概念,并通过三维可视化展示了真实位置与估计位置的关系。 目录 程序描述 运…

Linux命令进阶·如何切换root以及回退、sudo命令、用户/用户组管理,以及解决创建用户不显示问题和Ubuntu不显示用户名只显示“$“符号问题

目录 1. root用户(超级管理员) 1.1 用于账户切换的系统命令——su 1.2 退回上一个用户命令——exit 1.3 普通命令临时授权root身份执行——sudo 1.3.1 为普通用户配置sudo认证 2. 用户/用户组管理 2.1 用户组管理 2.2 用户管理 2.2.1 …