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

Java——权限修饰符

一、权限修饰符的继承访问规则

以下按访问范围从宽到窄排序:

修饰符同包同类同包子类同包非子类跨包子类跨包非子类
public✔️✔️✔️✔️✔️
protected✔️✔️✔️✔️
默认(包级)✔️✔️✔️
private✔️

关键点

  1. private成员:子类无法直接访问,需通过父类提供的public/protected方法间接操作(如getter/setter)12。
  2. protected成员
    • 允许跨包子类直接访问(如Child类继承Parent类后可直接调用父类protected方法)。
    • 同包内非子类也可访问(如Test类与Parent同包时可直接调用protected方法)13。
  3. 默认(包级):仅允许同包内的子类或非子类访问。

示例

// 父类(包com.example)
public class Parent {
    protected String name;  // 跨包子类可访问
    String id;              // 仅同包子类可访问
    private int age;        // 子类不可访问
}

// 子类(包com.other)
public class Child extends Parent {
    void accessFields() {
        name = "Child";     // ✔️ 允许访问protected字段
        // id = "123";      // ❌ 跨包无法访问默认权限字段
        // age = 10;        // ❌ 无法访问private字段
    }
}

二、方法重写的权限修饰符规则

子类重写父类方法时,访问权限必须 ≥ 父类方法(保证“里氏替换原则”):

  • 父类方法为public → 子类必须为public
  • 父类方法为protected → 子类可为protectedpublic
  • 父类方法为默认权限 → 子类可为默认、protectedpublic
  • 禁止缩小权限:如父类方法为protected,子类重写时不能改为private或默认14。

示例

class Parent {
    protected void show() {}  // 父类protected方法
}

class Child extends Parent {
    @Override
    public void show() {}     // ✔️ 允许扩大权限(protected → public)
    // @Override
    // private void show() {} // ❌ 禁止缩小权限(protected → private)
}

三、构造方法与super关键字的权限限制

  1. 构造方法继承
    • 子类构造方法默认调用父类无参构造super()
    • 若父类无无参构造,子类必须显式调用super(参数),且父类对应构造方法的权限需对子类可见6。
  2. super的使用
    • super可调用父类的非私有方法或访问非私有字段。
    • super不能在静态方法(如main)中使用,因为其依赖于对象实例1。

示例

class Parent {
    protected Parent(int x) {}  // 有参构造
}

class Child extends Parent {
    public Child() {
        super(10);  // ✔️ 显式调用父类protected构造方法
    }
}

四、官方文档补充

根据Java官方规范:

  • private方法:不可被继承,即使子类中出现同名方法,也视为新方法(非重写)7。
  • final修饰符:若父类方法被声明为final,子类无法重写该方法7。

五、最佳实践

  1. 最小权限原则:优先使用private,逐步放宽至protectedpublic
  2. 继承设计
    • 若父类方法需被子类扩展,使用protected
    • 若父类字段需被子类访问但对外隐藏,使用protected或提供getter/setter25。

参考资料:12347

相关文章:

  • 内容中台重构智能服务:人工智能技术驱动精准决策
  • 使用Python添加、读取和删除Word文档属性
  • Mac系统下使用Docker快速部署MaxKB:打造本地知识库问答系统
  • 区块链技术前沿:DApp、DeFi与IDO开发的深度探索
  • Python正则替换终极指南:用re.sub玩转字符串魔法
  • 微信小程序消息推送解密
  • 【Cesium for Unreal】叠加/卸载GeoServer发布的多个shapefile
  • uniapp引入uview组件库(可以引用多个组件)
  • 网络运维学习笔记 015网工初级(HCIA-Datacom与CCNA-EI)NAT网络地址转换
  • 【零基础实战】STM32控制DRV8833电机驱动详解
  • 【YOLO11改进trick】Pinwheel-shaped Conv风车状卷积引入YOLO11,含创新点代码,方便发论文
  • 硬件学习笔记--46 电能表影响量试验梳理
  • LLC谐振变换器原理
  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Live View Kit (1)
  • 力扣hot100——轮转数组
  • 搭建 Hadoop 3.3.6 伪分布式
  • Matplotlib中strpdate2num()函数报错的解决方法
  • 数字识别系统设计与实现
  • go~为什么会有json.Number这种类型存在
  • 大气体育直播模板赛事扁平自适应模板源码
  • 做一个介绍网站多少钱/广州竞价托管
  • 做翻译兼职的网站是哪个/最新国际新闻
  • layui做的网站/自己的网站怎么在百度上面推广
  • 大良网站建设市场/关键词收录
  • 网站没服务器行吗/免费b站推广网站2022
  • 徐州市住房建设局网站首页/怎么搭建属于自己的网站