0

我不敢相信我在这里没有找到任何关于这个问题的东西,所以:

为什么在派生类时需要显式定义超类的所有构造函数。当派生类不提供具有该签名的超级构造函数时,为什么 Java 不会自动调用超级构造函数。

那将是一些不错的“语法糖”

例如:在 Android 中,每个视图子类提供 3 个从 XML 或代码调用的构造函数。为了能够在代码和 XML 中创建自定义视图,我需要定义所有三个构造函数,即使它们不做任何事情。这是我昨天写的一个小例子

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;
    }

}

如果我不需要定义这些构造函数会更好。这种方法是否有任何缺点,或者是否有一些 Java 设计决策可以解释这一点?

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

4

2 回答 2

2

假设构造函数继承的……那么因为每个类最终都派生自 Object,所以每个类最终都会有一个无参数的构造函数。这是个坏主意。你究竟会期待什么:

FileInputStream stream = new FileInputStream();

去做?

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


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

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

于 2013-11-06T08:34:45.523 回答
0

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

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

于 2013-11-06T08:37:54.177 回答