我意识到这可能是一个愚蠢的问题,但我之前没有遇到过这个问题。下面的摘录声明了一个类。但我不知道为什么或理解为什么这个课程在自我中被重新宣布。
我仍然在学习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());
}
答案 0 :(得分:8)
这些不是重新声明 - 这些是构造函数定义。这三个定义中的每一个都指定了可以创建TouchExampleView
实例的方式。例如,在这样的表达式中:
TouchExampleView view = new TouchExampleView(context, someAttrs, style);
其中参数类型与构造函数定义(Context
,AttributeSet
和int
中声明的类型匹配)将调用第三个构造函数。
如果你写的话
TouchExampleView view = new TouchExampleView(context, someAttrs);
将调用第二个构造函数。其正文中的this
调用将使其使用defStyle = 0
运行第三个构造函数。
值得注意的另一件事是第三个构造函数中的super
调用。它是对超类构造函数的调用,在本例中为View
。
答案 1 :(得分:1)
您列出了3个构造函数,称为构造函数重载(方法重载的子集)。每一个都是有效的,但最后一个是“主”构造函数,前两个构造函数链接到它,并为省略的参数提供默认值。
然后,在此处创建实例的代码可以选择用于创建此类的新实例的构造函数。