2011-11-28 113 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個構造函數,稱爲構造函數重載(方法重載的一個子集)。每一個都是有效的,但最後一個是「主」構造函數,前兩個構造函數鏈接在該構造函數上,併爲省略參數提供默認值。

在此處創建實例的代碼可以選擇使用哪個構造函數來創建此類的新實例。