当前位置: 首页 > 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 {@Overridepublic 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

http://www.lryc.cn/news/540091.html

相关文章:

  • 一周学会Flask3 Python Web开发-redirect重定向
  • python面向对象:方法
  • 物联网简介集合
  • centos下使用pyenv管理python版本
  • C++:类与对象,定义类和构造函数
  • 【Java消息队列】应对消息丢失、重复、顺序与积压的全面策略
  • 解锁机器学习核心算法|神经网络:AI 领域的 “超级引擎”
  • Android14(13)添加墨水屏手写API
  • flyway的ignoreMigrationPatterns
  • 25年2月通信基础知识补充:多普勒频移与多普勒扩展、3GPP TDL信道模型
  • 华为动态路由-OSPF-骨干区
  • 接口测试-API测试中常用的协议(中)
  • 植物大战僵尸杂交版v3.2.1最新版本(附下载链接)
  • java每日精进 2.20 MQ相关复健
  • 【设计模式精讲】结构型模式之代理模式(静态代理、JDK动态代理、cglib动态代理)
  • 京东广告基于 Apache Doris 的冷热数据分层实践
  • win11 安装pyenv来管理python
  • 【AI】GitHub Copilot
  • 【LeetCode 热题100】76. 最小覆盖子串的算法思路及python代码
  • 力扣-回溯-17 电话号码的字母组合
  • [AHOI2018初中组] 分组---贪心算法
  • 知识图谱-学习计划
  • 网安作业3
  • 快速提升网站收录:内容创作的艺术
  • 【C语言】CreateFile函数用法介绍
  • 蓝桥杯好数
  • SOME/IP--协议英文原文讲解10
  • 欢乐力扣:赎金信
  • 【量化科普】Standard Deviation,标准差
  • stm32单片机个人学习笔记15(I2C通信协议)