假设由于某种原因我不想隐式调用super()
默认情况下完成的操作.
class Animal { public Animal() { System.out.println("Constructing an animal."); } } class Dog extends Animal { public Dog() { System.out.println("Constructing a dog."); } public static void main(String[] a) { new Dog(); } }
有没有办法"禁用" super()
制作新狗时调用的默认行为?或者这在主要和概念上是错误的吗?
我的意思是可能存在这样的情况:您只需要子类的构造函数而不调用基类的构造,并且仍然继承基类.
如果我理解正确你想要覆盖Animal
构造函数的行为或只是不调用它.如果是这样,你在概念上是错误的:你总是需要调用一个超级构造函数,你唯一能调用的是提供一个非默认的构造函数,即一个带参数并提供适当的参数来影响该构造函数的行为(例如,通过选择不同的构造函数,传递某种策略/功能对象等)
另一种方法可能是提供一些init()
默认构造函数正在调用的方法,你可以覆盖它但是它有一些问题,例如:
如果重写的方法试图访问仅对子类可见的任何内容(例如其他字段),则可能会遇到问题,因为那些尚未初始化.
该方法无法初始化任何最终字段.
有没有办法"禁用"制作新狗时调用super()的默认行为?或者这在主要和概念上是错误的吗?
它在概念上是错误的,因为任何调用其构造函数的类都必须调用其父构造函数:super()
或者super()
如果超级构造函数没有它,则使用任何参数.
如果超类的构造函数做了一些特定的处理而且并不是所有具体类都需要的,那么你应该更改超级构造函数的实现,并在超类的方法或具体类的方法中移动特定的行为. .