Java继承、构造器与super关键字使用问题咨询
Java OOP问题解答
问题1:能否通俗解释为什么VehicleMain子类中需要定义对应的构造器?
Java中的子类不会继承父类的构造方法,仅能继承成员属性和普通方法。你当前定义的VehicleMain子类,需要接收三个参数完成实例初始化,而父类的构造方法无法直接被子类当作自己的构造方法使用,所以你必须显式定义和参数匹配的构造器,才能支持new VehicleMain("参数1", 参数2, 参数3)这种实例化写法。
补充个额外情况:如果你不需要通过子类传参初始化父类属性,父类又存在无参构造器,那你可以不写子类构造器,编译器会自动给你生成一个默认的无参构造器,自动调用父类的无参构造。
问题2:子类的构造器中为什么要使用super()?
Java有个强制规则:子类构造器执行前,必须先完成父类的初始化逻辑。super()的作用就是调用父类的构造方法,完成父类部分的属性初始化。
另外父类的三个属性都是private私有修饰,子类根本没有权限直接修改这些属性,只能通过调用父类开放的构造方法,把接收到的参数传递给父类完成赋值,这也是super()在这里的核心作用。如果你不显式写带参数的super(),编译器只会自动给你加一个无参的super()调用父类的无参构造,你传的三个参数就没法赋值给父类属性了。
问题3:父类Vehicle的drive()方法中,应该直接访问私有属性description,还是调用getDescription()方法取值?
两种写法在父类当前的代码逻辑里都可以正常运行,但是更推荐使用getDescription() getter方法取值,原因有两个:
- 可维护性更高:如果后续你需要对返回的description做统一处理,比如空值兜底、加固定前缀、打印访问日志等,只需要修改
getDescription()这一个方法就可以,不用逐个修改所有直接访问属性的位置。 - 支持多态特性:如果后续有子类重写了
getDescription()方法,父类的drive方法中调用getter的话,运行时会自动调用子类重写后的方法,符合面向对象多态的设计要求;如果直接访问私有属性,就不会触发这个特性,只能拿到父类本身的属性值。
内容的提问来源于stack exchange,提问作者user12031183
相关产品推荐
相关产品推荐

