当前位置: 首页 > article >正文

【JAVA面试】java权限修饰符

在 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.kler.cn/a/502498.html

相关文章:

  • 浏览器中调用vue方法
  • python实现自动登录12306抢票 -- selenium
  • Qt WORD/PDF(五)使用Json一键填充Word表格
  • 基于单片机的智能花卉浇水系统的设计与实现
  • 利用 NATIVE SQL 实现不区分供应商名字大小写进行模糊查询
  • React Fiber框架中的Render渲染阶段——workLoop(performUnitOfWork【beginWork与completeWork】)
  • STM32-Flash存储
  • 二叉树层序遍历 Leetcode102.二叉树的层序遍历
  • 论文笔记(六十一)Implicit Behavioral Cloning
  • 数据挖掘实训:基于CEEMDAN与多种机器学习模型股票预测与时间序列建模
  • PHP数据过滤函数详解:filter_var、filter_input、filter_has_var等函数的数据过滤技巧
  • python-PC应用自动化操作
  • 【LeetCode: 179. 最大数 + 贪心】
  • 福建双色荷花提取颜色
  • C# GDI+的DrawString无法绘制Tab键的现象
  • 腾讯云AI代码助手编程挑战赛-智能聊天助手
  • 大语言模型预训练、微调、RLHF
  • YangQG 面试题汇总
  • Java安全—SPEL表达式XXESSTI模板注入JDBCMyBatis注入
  • 玩转大语言模型——langchain调用ollama视觉多模态语言模型
  • Ubuntu Server挂载AWS S3成一个本地文件夹
  • Nginx简述
  • MySQL表的增删改查(进阶)-上篇
  • Vue.js组件开发-图片剪裁性能优化最佳方案实例
  • 【JVM-2.3】深入解析JVisualVM:Java性能监控与调优利器
  • 【解决问题】WSL报错 Netlink send error : Invalid argument