Java继承理解咨询:子类重写父类方法场景的困惑
Hey there! Let's walk through your code step by step and clear up all the confusion around method overriding in this inheritance scenario.
1. 先明确:你写的就是标准的方法重写
你在SubClass中定义的sharedMethod(),完全符合Java方法重写的核心要求:
- 方法名、参数列表(这里无参数)和父类
SuperClass的sharedMethod()完全一致 - 访问修饰符
public和父类保持一致(允许更宽松,但不能更严格,比如父类是public,子类不能用private) - 返回类型
void和父类完全匹配
简单说:子类重新实现了父类的同名方法,这就是重写——目的是让子类拥有专属的方法逻辑,替代父类的默认实现。
2. 构造器里的super()为什么必须写?
看你的SuperClass,它只定义了带参构造器public SuperClass(String name, int age),没有默认的无参构造器。在Java中,子类构造器必须在第一行调用父类的构造器:
- 如果父类有默认无参构造器,编译器会自动帮你加
super(); - 但父类只有带参构造器时,你必须显式调用
super(name, age);,否则编译直接报错
你的代码里已经做了这一步,非常正确!这行代码的作用是让父类先完成自身属性(name和age)的初始化,子类才能正常继承这些属性(虽然父类用private修饰,子类不能直接访问,但可以通过后续添加的getter方法获取)。
3. 重写后的方法调用逻辑
当你创建SubClass的实例并调用sharedMethod()时,会执行子类的版本,而不是父类的:
SubClass sub = new SubClass("Alice", 25); sub.sharedMethod(); // 输出:I'm ...
如果想在子类的重写方法中同时调用父类的原方法,可以用super.sharedMethod(),比如修改子类代码:
@Override public void sharedMethod() { super.sharedMethod(); // 先执行父类的方法逻辑 System.out.println("I'm the overridden method in SubClass"); }
这样调用后会先输出父类的I'm a shared method in the SuperClass,再输出子类的内容。
4. 给你的优化建议:加上@Override注解
强烈建议在重写的方法上加上@Override注解,比如:
@Override public void sharedMethod() { System.out.println("I'm ..."); }
这个注解的作用是让编译器帮你校验:这个方法是不是真的重写了父类的方法。如果方法名写错(比如写成shareMethod)、参数列表不一致,编译器会直接报错,避免你不小心写出一个全新的方法而不是重写。
5. 多态的体现:父类引用指向子类实例
如果用父类类型的变量指向子类实例,调用sharedMethod()依然会执行子类的版本——这就是Java的动态绑定特性,也是多态的核心:
SuperClass obj = new SubClass("Bob", 30); obj.sharedMethod(); // 还是输出:I'm ...
运行时JVM会根据实际对象的类型(这里是SubClass)来调用对应的方法,而不是变量的声明类型。
最后再划几个重写的红线
- 父类的私有方法不能被重写:因为子类根本访问不到父类的私有方法
- 静态方法不能被重写:那叫方法隐藏(hiding),逻辑和重写完全不同,调用时看的是变量的声明类型,不是实际对象类型
- 重写方法的抛出异常范围不能比父类方法更宽泛(比如父类抛出
IOException,子类不能抛出Exception)
内容的提问来源于stack exchange,提问作者user9398286

