Java在自身内部重新定义类

时间:2011-11-28 22:28:24

标签: java

我意识到这可能是一个愚蠢的问题,但我之前没有遇到过这个问题。下面的摘录声明了一个类。但我不知道为什么或理解为什么这个课程在自我中被重新宣布。

我仍然在学习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());
    }

2 个答案:

答案 0 :(得分:8)

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

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

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

如果你写的话

TouchExampleView view = new TouchExampleView(context, someAttrs);

将调用第二个构造函数。其正文中的this调用将使其使用defStyle = 0运行第三个构造函数。

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

答案 1 :(得分:1)

您列出了3个构造函数,称为构造函数重载(方法重载的子集)。每一个都是有效的,但最后一个是“主”构造函数,前两个构造函数链接到它,并为省略的参数提供默认值。

然后,在此处创建实例的代码可以选择用于创建此类的新实例的构造函数。