我无法相信我在这里找不到任何问题,所以:
为什么在派生类时需要显式定义超类的所有构造函数。当派生类不提供具有该签名的类时,为什么Java不会自动调用超级构造函数。
这将是“Syntactic Sugar”的一些不错的部分。
例如:在Android中,每个View Subclass都提供3个构造函数,这些构造函数可以从XML或Code中调用。为了能够在代码和XML中创建自定义视图,我需要定义所有三个构造函数,即使它们不执行任何操作。这是一个小例子我had to write yesterday
public class OverfocusableGridView extends GridView {
public OverfocusableGridView(Context context) {
super(context);
}
public OverfocusableGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public OverfocusableGridView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean keyHandled = false;
if (this.getSelectedView() != null) {
int focusedViewPosition = this.getSelectedItemPosition();
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_LEFT:
if (focusedViewPosition > 0) {
int prevItemPosition = focusedViewPosition - 1;
this.setSelection(prevItemPosition);
keyHandled = true;
}
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
if (focusedViewPosition < this.getChildCount() - 1) {
int nextItemPosition = focusedViewPosition + 1;
this.setSelection(nextItemPosition);
keyHandled = true;
}
break;
default:
keyHandled = super.onKeyDown(keyCode, event);
}
} else {
keyHandled = super.onKeyDown(keyCode, event);
}
return keyHandled;
}
}
如果我不需要定义theese构造函数,会更好。这种方法是否存在任何缺点,或者是否有一些Java设计决策可以解释这一点?
所以,长话短说:这不可能是有原因的吗?
答案 0 :(得分:2)
假设构造函数 继承...然后因为每个类最终都派生自Object,每个类最终会得到一个无参数构造函数。这是个坏主意。你到底想要什么:
FileInputStream stream = new FileInputStream();
要做什么?
现在可能应该有一种方法可以轻松创建相当常见的“传递”构造函数,但我不认为它应该是默认的。构造子类所需的参数通常不同于超类所需的参数。
答案来自: https://stackoverflow.com/a/1644410/1724097
没有“继承”这个词很难找到另一个问题,所以我明白为什么你没找到答案(:
答案 1 :(得分:0)
Java子类不需要与超类具有相同的构造函数!通常,子类具有更少和/或更简单的构造函数。
你真的需要所有构造函数吗?