2011-11-28 86 views
2

我意识到这可能是一个愚蠢的问题,但我之前没有遇到过。下面的摘录是宣布一个类。但是我不知道为什么或者明白为什么这个班级在自己内部被重新宣布。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()); 
    } 

回答

8

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

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

其中类型的参数匹配的构造定义(ContextAttributeSetint)第三个构造将被称为声明类型。

如果你会写

TouchExampleView view = new TouchExampleView(context, someAttrs); 

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

另一件值得注意的事情是在第三个构造函数中调用super。这是一个超级构造函数的调用,在这种情况下是View

+1

重载的构造函数,确切地说。 – ChristopheD

+0

感谢您的解释。我并不完全理解为什么我发布的摘录是按照它的方式构建的,但我现在至少可以研究它在做什么。 – Somk

1

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

在此处创建实例的代码可以选择使用哪个构造函数来创建此类的新实例。