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

Java中的访问修饰符有哪些

在 Java 中,访问修饰符(Access Modifiers)用于控制类、方法、变量和构造器的访问权限。Java 提供了四种访问修饰符,分别是:

  • public
  • protected
  • default(包私有,没有显式修饰符)
  • private

public

  • 访问范围:最大范围的访问权限。
  • 作用:
    • 被 public 修饰的类、方法、变量或构造器可以在任何地方访问。
    • 如果类是 public,则类名必须与文件名一致。
public class MyClass {
    public int myVar;
    public void myMethod() {
        System.out.println("Public Method");
    }
}

protected

  • 访问范围:
    • 同一包内的类可以访问。
    • 不同包中的子类可以访问。
  • 作用:
    • 主要用于继承场景,允许子类访问父类的成员。
package com.example;

public class Parent {
    protected int myVar;
    protected void myMethod() {
        System.out.println("Protected Method");
    }
}

package com.another;

import com.example.Parent;

public class Child extends Parent {
    void accessParent() {
        myVar = 10;       // 可以访问 protected 变量
        myMethod();       // 可以访问 protected 方法
    }
}

default(包私有)

  • 访问范围:
    • 同一包内的类可以访问。
    • 不同包中的类无法访问。
  • 作用:
    • 如果不显式指定访问修饰符,则默认为 default。
package com.example;

class MyClass {
    int myVar; // default 访问权限
    void myMethod() {
        System.out.println("Default Method");
    }
}

private

  • 访问范围:
    • 仅限当前类内部访问。
  • 作用:
    • 用于封装类的内部实现细节,防止外部直接访问。
public class MyClass {
    private int myVar;
    private void myMethod() {
        System.out.println("Private Method");
    }

    public void setMyVar(int value) {
        this.myVar = value; // 可以在类内部访问 private 变量
    }
}

访问修饰符的总结

访问修饰符类内部同一包内不同包的子类不同包的非子类
public✔️✔️✔️✔️
protected✔️✔️✔️
default✔️✔️
private✔️

访问修饰符的使用场景

public:
用于暴露 API,如工具类的方法或常量。例如:public static final int MAX_VALUE = 100;

protected:
用于允许子类扩展父类的功能。例如:protected void init() { … }

default:
用于包内共享的辅助类或工具方法。例如:void helperMethod() { … }

private:
用于封装类的内部实现细节。例如:private String secretKey;

注意事项

  • 类的访问修饰符只能是 public 或 default(包私有)。
  • 接口中的方法默认是 public,变量默认是 public static final。
  • 构造器可以使用 public、protected、default 或 private。
  • private 构造器常用于单例模式或工具类。
package com.example;

public class AccessExample {
    public int publicVar = 1;
    protected int protectedVar = 2;
    int defaultVar = 3; // default 访问权限
    private int privateVar = 4;

    public void publicMethod() {
        System.out.println("Public Method");
    }

    protected void protectedMethod() {
        System.out.println("Protected Method");
    }

    void defaultMethod() {
        System.out.println("Default Method");
    }

    private void privateMethod() {
        System.out.println("Private Method");
    }
}

class AnotherClass {
    void testAccess() {
        AccessExample example = new AccessExample();
        System.out.println(example.publicVar);       // 可以访问
        System.out.println(example.protectedVar);    // 可以访问
        System.out.println(example.defaultVar);      // 可以访问
        // System.out.println(example.privateVar);  // 编译错误,无法访问 private 变量
    }
}

http://www.kler.cn/a/586932.html

相关文章:

  • Swagger 从 .NET 9 中删除:有哪些替代方案
  • 洛谷 P4933 大师
  • LRU(最近最少使用)算法实现
  • 探索Maas平台与阿里 QWQ 技术:AI调参的魔法世界
  • 车载软件刷写工具vFlash --- 自动化接口(Automation API)应用简介
  • 德语A1学习
  • 批量ip反查域名工具
  • 删除有序数组中的重复项(26)
  • [网络] 网络基础概念--socket编程预备
  • Ubuntu 24 常用命令方法
  • 【Git】配置Git
  • 按钮权限的设计及实现
  • uniapp-x vue 特性
  • 在线 SQL 转 SQLAlchemy:一键生成 Python 数据模型
  • AcWing--870.约数个数
  • Windows环境下安装部署dzzoffice+onlyoffice的私有网盘和在线协同系统
  • Java中的I/O
  • 通过qemu仿真树莓派系统调试IoT固件和程序
  • 深度解析国产推理大模型DeepSeek:从入门到本地化部署!
  • C++Primer学习(7.1 定义抽象数据类型)