我意识到这可能是一个愚蠢的问题,但是我以前从未遇到过。下面的摘录声明了一个类。但是我不知道为什么或不理解为什么在自身内部重新声明该类。

我仍在学习Java的来龙去脉,因此希望对您有所帮助。我也知道我可能会使用错误的术语,因为我对Java的细节一无所知。请纠正我的无知。

public class TouchExampleView extends View {
    private Drawable mIcon;
    private float mPosX;
    private float mPosY;

    private float mLastTouchX;
    private float mLastTouchY;

    public TouchExampleView(Context context) {
        this(context, null, 0);
    }

    public TouchExampleView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public TouchExampleView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mIcon = context.getResources().getDrawable(R.drawable.icon);
        mIcon.setBounds(0, 0, mIcon.getIntrinsicWidth(), mIcon.getIntrinsicHeight());
    }

最佳答案

这些不是重新声明-这些是构造函数定义。这三个定义中的每一个都指定了创建TouchExampleView实例的方式。例如,在这样的表达式中:

TouchExampleView view = new TouchExampleView(context, someAttrs, style);


其中参数类型与构造函数定义中声明的类型(ContextAttributeSetint)匹配,将调用第三个构造函数。

如果你写

TouchExampleView view = new TouchExampleView(context, someAttrs);


第二个构造函数将被调用。主体中的this调用将使它使用defStyle = 0运行第三个构造函数。

值得注意的另一件事是第三个构造函数中的super调用。它是对超类构造函数的调用,在本例中为View

08-16 19:08