类与接口中方法的重写、重声明、隐藏及重定义问题咨询
问题解答
一、原说法的正误判断与细节补充
你的说法存在部分不准确,分场景拆解如下:
1. 类继承类
- 静态方法:子类可以声明同名同签名的静态方法,这是隐藏(Hide),而非重写。调用时取决于变量的编译期类型,不支持多态。父类静态方法不会被覆盖,只是子类的同名方法屏蔽了父类的。
- 实例方法:非
private、非final、非static的实例方法可以被重写(Override),遵循运行时多态,调用时看对象的实际类型。
2. 接口继承接口
- 静态方法(Java 8+):子接口可以声明同名同签名的静态方法,这属于隐藏。接口静态方法本身不能被实现类继承,子接口的静态方法与父接口的是完全独立的两个方法。
- 实例方法:
- 抽象方法:子接口可以重新声明同名抽象方法(相当于细化约束),但不属于重写;
- 默认方法:子接口可以重写父接口的默认方法,此时子接口的实现类会优先使用子接口的默认方法。
3. 类实现接口
- 静态方法:实现类无法继承接口的静态方法,因此不存在重声明或重写。实现类若声明同名静态方法,只是自己的独立方法,和接口静态方法无关联。
- 实例方法:必须实现接口的抽象方法,也可以重写接口的默认方法,这属于实现/重写,支持运行时多态。
二、重定义 vs 重写
两者不等同:
- 重写(Override):是严格的面向对象概念,仅针对实例方法,需满足方法签名完全一致、访问权限不缩小、返回类型兼容等规则,且支持多态,可通过
@Override注解校验。 - 重定义(Redefine):是宽泛术语,涵盖了重写、静态方法隐藏、甚至方法重载(部分语境下)。只要子类/实现类声明了与父类/接口同名的方法,都可被称为重定义,但只有符合重写规则的实例方法才是重写。
三、概念关系流程图
flowchart TD A[方法声明场景] --> B[类继承类] A --> C[接口继承接口] A --> D[类实现接口] B --> B1[静态方法] B1 --> B1a[子类声明同名方法]:::hide B1a --> B1b[隐藏(Hide)] B --> B2[实例方法(非private/final/static)] B2 --> B2a[子类重写方法]:::override B2a --> B2b[重写(Override)] C --> C1[静态方法] C1 --> C1a[子接口声明同名方法]:::hide C1a --> C1b[隐藏(Hide)] C --> C2[实例方法] C2 --> C2a[抽象方法:子接口重新声明]:::redefine C2a --> C2c[重定义(Redefine)] C2 --> C2b[默认方法:子接口重写]:::override C2b --> C2d[重写(Override)] D --> D1[静态方法] D1 --> D1a[实现类声明同名方法]:::redefine D1a --> D1b[独立方法(无继承关联)] D --> D2[实例方法] D2 --> D2a[实现抽象方法/重写默认方法]:::override D2a --> D2b[重写(Override)] E[重定义范围] --> B1b E --> C1b E --> C2c E --> D1b E --> B2b E --> C2d E --> D2b F[重写范围] --> B2b F --> C2d F --> D2b classDef hide fill:#f9f,stroke:#333,stroke-width:2px classDef override fill:#9f9,stroke:#333,stroke-width:2px classDef redefine fill:#ff9,stroke:#333,stroke-width:2px
内容的提问来源于stack exchange,提问作者Oyst
相关产品推荐
相关产品推荐

