商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Java中 抽象类中的抽象方法在子类重写时怎么改变访问权限

Java中 抽象类中的抽象方法在子类重写时怎么改变访问权限

  发布于2026-07-15 阅读(0)

扫一扫,手机访问

先明确一个基本规则:在 Ja va 里,子类重写抽象类中的抽象方法时,访问权限只能扩大或保持不变,绝不能缩小——这是编译器强制执行的,背后是为了保证里氏替换原则和多态调用的安全性。不少开发者在刚接触继承时都踩过这个坑,其实理解清楚背后的逻辑,就再也不会犯错了。

Ja va中 抽象类中的抽象方法在子类重写时怎么改变访问权限

抽象类中的抽象方法在子类中重写时,访问权限只能扩大或保持不变,不能缩小——这是 Ja va 编译器强制执行的规则,核心是为了满足里氏替换原则和保障多态调用安全。

抽象方法的原始访问权限有哪些

抽象类中声明的抽象方法,其访问修饰符只能是 publicprotected 或默认(包私有),不能是 private。原因很简单:private 方法不可被继承,自然也无法被重写。

  • public abstract void doWork(); —— 最常见,跨包可继承
  • protected abstract void sa ve(); —— 同包或子类可继承
  • abstract void init(); —— 默认(包私有),仅限同包内子类继承

子类重写时允许怎么改

子类实现抽象方法时,必须提供具体方法体,且访问权限必须 ≥ 父类抽象方法的权限。合法调整如下:

  • 父类是 public → 子类必须用 public(无法再扩大)
  • 父类是 protected → 子类可用 protectedpublic
  • 父类是 默认(包私有) → 子类可用 默认protectedpublic(但前提是子类与抽象类在同一包内;若跨包,则默认方法根本不可见,无法继承)

为什么不能缩小权限

假设父类抽象方法是 public,子类却实现为 protected 或 private,那么通过父类引用调用该方法时就会失败——编译器只认父类声明的可见性,运行时却指向子类实现。这直接破坏了“子类对象能完全替代父类对象”的前提。

举个例子:public abstract class Animal { public abstract void move(); } 若子类写成 private void move() { ... },编译器会报错:Cannot reduce the visibility

static 和 final 方法不适用此规则

抽象方法本身就不能是 static 或 final,所以不存在“重写 static 抽象方法”的情况。子类中间出现同名 static 方法,属于隐藏(hiding),不是重写;final 方法则根本不可重写。

本文转载于:https://www.php.cn/faq/2823522.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注