需要在重写的类中定义显式构造函数

时间:2013-11-06 08:31:57

标签: java

我无法相信我在这里找不到任何问题,所以:

为什么在派生类时需要显式定义超类的所有构造函数。当派生类不提供具有该签名的类时,为什么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设计决策可以解释这一点?

所以,长话短说:这不可能是有原因的吗?

2 个答案:

答案 0 :(得分:2)

假设构造函数 继承...然后因为每个类最终都派生自Object,每个类最终会得到一个无参数构造函数。这是个坏主意。你到底想要什么:

FileInputStream stream = new FileInputStream();

要做什么?

现在可能应该有一种方法可以轻松创建相当常见的“传递”构造函数,但我不认为它应该是默认的。构造子类所需的参数通常不同于超类所需的参数。


答案来自: https://stackoverflow.com/a/1644410/1724097

没有“继承”这个词很难找到另一个问题,所以我明白为什么你没找到答案(:

答案 1 :(得分:0)

Java子类不需要与超类具有相同的构造函数!通常,子类具有更少和/或更简单的构造函数。

你真的需要所有构造函数吗?