【JAVA面试】java权限修饰符

news2025/1/12 2:57:44

在 Java 中,访问权限(Access Modifiers)用于控制类、方法、成员变量等的访问范围。合理使用访问权限能够增强代码的安全性、封装性以及可维护性。


Java 的访问权限修饰符

Java 提供了以下四种访问权限修饰符,分别是:

修饰符类内同包子类跨包
public
protected❌ (除非通过继承访问)
default(无修饰符)
private

1. public

特点
  • public 表示全局访问权限。
  • 可以被任何其他类访问,无论是否位于同一个包中。
应用场景
  • :类可以被任何地方使用。
  • 方法和变量:通常用于工具类方法、常量,或者明确需要对外公开的接口。
示例
public class PublicExample {
    public int publicField = 10;

    public void publicMethod() {
        System.out.println("This is a public method.");
    }
}
访问示例
  • 在同一个包或不同包中都可以访问:
    PublicExample example = new PublicExample();
    example.publicMethod();  // 可访问
    System.out.println(example.publicField);  // 可访问
    

2. protected

特点
  • protected 表示受保护权限。
  • 只能在同一个包中访问,或通过继承关系由子类访问。
应用场景
  • 方法和变量:用于希望对子类开放但不对外公开的成员。
示例
package package1;

public class ProtectedExample {
    protected int protectedField = 20;

    protected void protectedMethod() {
        System.out.println("This is a protected method.");
    }
}
访问示例
  • 同包访问

    package package1;
    
    public class SamePackage {
        public void accessProtected() {
            ProtectedExample example = new ProtectedExample();
            example.protectedMethod();  // 可访问
            System.out.println(example.protectedField);  // 可访问
        }
    }
    
  • 跨包访问(通过子类)

    package package2;
    
    import package1.ProtectedExample;
    
    public class SubClass extends ProtectedExample {
        public void accessProtected() {
            protectedMethod();  // 可访问
            System.out.println(protectedField);  // 可访问
        }
    }
    
  • 跨包无继承关系时无法访问


3. 默认(Default / Package-Private)

特点
  • 如果没有指定修饰符,则默认是包级私有权限(package-private)。
  • 只能在同一个包中访问,跨包访问不允许。
应用场景
  • :限制类仅在包内部使用。
  • 方法和变量:适用于内部实现细节,不需要对子类或外部提供访问权限。
示例
package package1;

class DefaultExample {  // 无修饰符,包级私有类
    int defaultField = 30;  // 默认权限

    void defaultMethod() {  // 默认权限
        System.out.println("This is a default method.");
    }
}
访问示例
  • 同包访问

    package package1;
    
    public class SamePackage {
        public void accessDefault() {
            DefaultExample example = new DefaultExample();
            example.defaultMethod();  // 可访问
            System.out.println(example.defaultField);  // 可访问
        }
    }
    
  • 跨包访问不允许

    package package2;
    
    import package1.DefaultExample;  // 无法导入,编译错误
    

4. private

特点
  • private 表示私有权限。
  • 只能在类的内部访问,其他类(即使是同一个包中的类)无法访问。
应用场景
  • 方法和变量:用于封装类的内部实现细节,不允许外部直接访问。
示例
public class PrivateExample {
    private int privateField = 40;

    private void privateMethod() {
        System.out.println("This is a private method.");
    }

    public void accessPrivate() {
        System.out.println(privateField);  // 类内部访问
        privateMethod();  // 类内部访问
    }
}
访问示例
  • 只能在类内部访问:
    PrivateExample example = new PrivateExample();
    example.accessPrivate();  // 通过公共方法访问私有成员
    

5. 类的访问权限

类的权限修饰符
  • public:可以被任何包中的类访问。
  • default:只能被同一个包中的类访问。
  • 类不能使用 privateprotected 修饰。
示例
// 包级私有类
class PackagePrivateClass {
    void method() {
        System.out.println("This is a package-private class.");
    }
}

// 公共类
public class PublicClass {
    public void method() {
        System.out.println("This is a public class.");
    }
}

访问权限的设计原则

  1. 信息隐藏

    • 使用 private 隐藏实现细节,防止外部直接操作类的内部状态。
    • 提供 publicprotected 的方法(如 Getter/Setter)来控制对私有数据的访问。
  2. 最小化访问范围

    • 优先选择更严格的访问权限(如 private),然后根据需要逐步放宽。
    • 确保不会暴露不必要的接口或数据。
  3. 包内模块化

    • 使用 default 权限将类或成员限制在包内,便于模块化管理。
  4. 继承与扩展

    • 使用 protected 允许子类访问需要的功能,同时隐藏不必要的细节。

总结

修饰符适用范围访问范围典型用途
public类、方法、变量任意地方公共 API、工具类、通用方法
protected方法、变量同包或子类继承支持,允许子类扩展功能
default类、方法、变量同包内可访问内部实现,不需要对外暴露的功能
private方法、变量仅类内部封装类的内部实现细节,保护类的完整性

通过合理使用这些访问修饰符,可以有效控制代码的访问权限,增强系统的封装性和安全性。

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

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

相关文章

Flink三种集群部署模型

这里写自定义目录标题 Flink 集群剖析Flink 应用程序执行Flink Session 集群(Session Mode)Flink Job 集群(以前称为per-job)Flink Application 集群(Application Mode) 参考 Flink 集群剖析 Flink 运行时…

JVM实战—12.OOM的定位和解决

大纲 1.如何对系统的OOM异常进行监控和报警 2.如何在JVM内存溢出时自动dump内存快照 3.Metaspace区域内存溢出时应如何解决(OutOfMemoryError: Metaspace) 4.JVM栈内存溢出时应如何解决(StackOverflowError) 5.JVM堆内存溢出时应该如何解决(OutOfMemoryError: Java heap s…

一文读懂「LoRA」:大型语言模型的低秩适应

LoRA: Low-Rank Adaptation of Large Language Models 前言 LoRA作为大模型的微调框架十分实用,在LoRA出现以前本人都是通过手动修改参数、优化器或者层数来“炼丹”的,具有极大的盲目性,但是LoRA技术能够快速微调参数,如果LoRA…

IT面试求职系列主题-人工智能(一)

想成功求职,必要的IT技能一样不能少,再从人工智能基础知识来一波吧。 1)您对人工智能的理解是什么? 人工智能是计算机科学技术,强调创造能够模仿人类行为的智能机器。这里智能机器可以定义为能够像人一样行动、像人一…

浏览器报错:您的连接不是私密连接,Kubernetes Dashboard无法打开

问题描述 部署完成Kubernetes Dashboard后,打开HTTPS的web页面,Chrome和Edge浏览器都无法正常加载页面,会提示您的连接不是私密连接的报错。 ​​​​​​​​​​​​ 原因: 浏览器不信任这些自签名的ssl证书,为了…

【Unity插件】解决移动端UI安全区问题 - Safe Area Helper

在移动端设计界面时,必须要考虑的就是UI的安全区。 Unity本身也提供了Safearea的API。 但在asset store时已经有人提供了免费的插件(Safe Area Helper),我们可以直接使用。 插件链接: https://assetstore.unity.com/p…

ffmpeg7.0 aac转pcm

#pragma once #define __STDC_CONSTANT_MACROS #define _CRT_SECURE_NO_WARNINGSextern "C" { #include "libavcodec/avcodec.h" }//缓冲区大小(缓存5帧数据) #define AUDIO_INBUF_SIZE 40960 /*name depthu8 8s16 …

USRP X310 Windows 烧录镜像

说明 USRP-X 系列设备包含两个用于两个以太网通道的 SFP 端口。由于 SFP 端口支持 1 千兆 (SFP) 和 10 千兆 (SFP) 收发器,因此 UHD 附带了多个 FPGA 图像,以确定上述接口的行为。 注意:Aurora 图像需要从 FPGA 源代码手动构建。 FPGA 图像…

新型物联网智能断路器功能参数介绍

安科瑞刘鸿鹏 摘要 智能断路器作为现代配电系统的重要组成部分,以其实时监测、多重保护和远程操控的智能化功能,显著提升了电力系统的运行效率和安全性。本文以ASCB1系列智能断路器为例,探讨其技术特点和在工业、商业及民用建筑中的应用价…

119.使用AI Agent解决问题:Jenkins build Pipeline时,提示npm ERR! errno FETCH_ERROR

目录 1.Jenkins Build时的错误 2.百度文心快码AI智能体帮我解决 提问1:jenkins中如何配置npm的源 提问2:jenkins pipeline 类型为pipeline script from SCM时,如何配置npm源 3.最终解决方法-Jenkinsfile的修改 4.感触 1.Jenkins Build时…

pytest+allure 入门

使用allure如何生成自动化测试报​​​​​​告 ?一文详解allure的使用 。_allure测试报告-CSDN博客 例子: import allure import pytest import osallure.epic("闹钟") allure.feature("闹钟增删") class TestSchedule():def setu…

【FPGA】时序约束与分析

设计约束 设计约束所处环节: 约束输入 分析实现结果 设计优化 设计约束分类: 物理约束:I/O接口约束(例如引脚分配、电平标准设定等物理属性的约束)、布局约束、布线约束以及配置约束 时序约束:设计FP…

【Vim Masterclass 笔记09】S06L22:Vim 核心操作训练之 —— 文本的搜索、查找与替换操作(第一部分)

文章目录 S06L22 Search, Find, and Replace - Part One1 从光标位置起,正向定位到当前行的首个字符 b2 从光标位置起,反向查找某个字符3 重复上一次字符查找操作4 定位到目标字符的前一个字符5 单字符查找与 Vim 命令的组合6 跨行查找某字符串7 Vim 的增…

win32汇编环境,窗口程序中对按钮控件常用操作的示例

;运行效果 ;win32汇编环境,窗口程序中对按钮控件常用操作的示例 ;常用的操作,例如创建按钮控件,使其无效,改变文本,得到文本等。 ;将代码复制进radasm软件里,直接就可以编译运行。重点部分加备注。 ;>&g…

继承(7)

大家好,今天我们继续来学习一下继承的知识,这方面需要大家勤动脑才能理解,那么我们来看。 1.9 protected关键字 在类和对象章节中,为了实现封装特性,java中引入访向限定符,主要限定:类或者类中成员能否在类外和其他包中被访问. …

基于RK3568/RK3588大车360度环视影像主动安全行车辅助系统解决方案,支持ADAS/DMS

产品设计初衷 HS-P2-2D是一款针对大车盲区开发的360度全景影像 安全行车辅助系统,通过车身四周安装的超广角像机,经算法合成全景鸟瞰图,通过鸟瞰图,司机非常清楚的看清楚车辆四周情况,大大降低盲区引发的交通事故。 产…

NVIDIA发布GeForce RTX 50 系列,售价549美元起

2025 CES消费电子展(1月7日至10日,美国拉斯维加斯)正式开幕。北京时间1月7日 (星期二)上午10:30,NVIDIA举办主题演讲,CEO黄仁勋担任主讲。正式发布了全新的RTX 50系列显卡!一月下旬上市。同时公布了各版本的…

后端:Spring(IOC、AOP)

文章目录 1. Spring2. IOC 控制反转2-1. 通过配置文件定义Bean2-1-1. 通过set方法来注入Bean2-1-2. 通过构造方法来注入Bean2-1-3. 自动装配2-1-4. 集合注入2-1-5. 数据源对象管理(第三方Bean)2-1-6. 在xml配置文件中加载properties文件的数据(context命名空间)2-1-7. 加载容器…

基于EasyExcel实现通用版一对一、一对多、多层嵌套结构数据导出并支持自动合并单元格

接口功能 通用 支持一对一数据结构导出 支持一对多数据结构导出 支持多层嵌套数据结构导出 支持单元格自动合并 原文来自:https://blog.csdn.net/qq_40980205/article/details/136564176 新增及修复 基于我自己的使用场景,新增并能修复一下功能&#x…

【数据库】一、数据库系统概述

文章目录 一、数据库系统概述1 基本概念2 现实世界的信息化过程3 数据库系统内部体系结构4 数据库系统外部体系结构5 数据管理方式 一、数据库系统概述 1 基本概念 数据:描述事物的符号记录 数据库(DB):长期存储在计算机内的、…