Java父类子类构造调用规则及@Override注解使用相关疑问
问题1 子类构造方法调用父类构造的规则
你的认知缺了Java的默认隐式调用规则:
- 如果父类存在公开的无参构造方法,子类构造方法第一行如果没有显式写
super()调用父类构造,也没有写this()调用自身其他构造方法,编译器会自动在子类构造的最开头插入一个无参的super()调用,不需要你手写。 - 你这段代码里父类
Vehicle已经明确定义了无参构造public Vehicle() { },所以两个子类的构造方法本质上都隐式调用了父类的无参构造,自然可以正常运行。 - 只有当父类没有无参构造方法时(比如父类只定义了带参数的构造,没有手动写无参构造,此时编译器也不会自动生成默认无参构造),才要求子类必须在构造方法第一行显式调用父类的带参构造,传入对应参数,否则会编译报错。
问题2 @Override注解的作用
这个注解不是必须使用的,它是可选的编译校验注解,和参数是否一致没有“只有一致才需要用”的绑定关系:
- 它的核心作用是告诉编译器:你当前定义的这个方法意图是重写父类/接口的方法,编译器会自动帮你校验是否符合重写的所有要求(方法名、参数列表的类型/个数/顺序、返回值类型符合规则,访问权限不低于父类方法)。
- 你这段代码里Kawasaki的
countWheels()完全符合重写要求,就算不加@Override也能正常实现重写效果,但加了注解之后,如果你后续不小心写错了方法名、参数列表,编译器会直接报错提醒,避免出现“你以为是重写实际是重载”的低级错误。 - 如果你的方法本来就不是要重写父类方法,就不要加这个注解,否则编译器会直接报错。
内容的提问来源于stack exchange,提问作者apex2022
相关产品推荐
相关产品推荐

