2013-05-15 35 views
1

爲什麼這個類中的三個構造函數中的兩個使用this(context)而不是super(context)?爲什麼這個類中的一些構造函數使用this(context)而不是super(context)?

類是提供一個更大的項目的一部分,在https://code.google.com/p/android-touchexample/source/browse/branches/cupcake/src/com/example/android/touchexample/TouchExampleView.java

package com.example.android.touchexample; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.drawable.Drawable; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 

public class TouchExampleView extends View { 

private Drawable mIcon; 
private float mPosX; 
private float mPosY; 

private VersionedGestureDetector mDetector; 
private float mScaleFactor = 1.f; 

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()); 

    mDetector = VersionedGestureDetector.newInstance(context, new GestureCallback()); 
} 

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    mDetector.onTouchEvent(ev); 
    return true; 
} 

@Override 
public void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    canvas.save(); 
    canvas.translate(mPosX, mPosY); 
    canvas.scale(mScaleFactor, mScaleFactor); 
    mIcon.draw(canvas); 
    canvas.restore(); 
} 

private class GestureCallback implements VersionedGestureDetector.OnGestureListener { 
    public void onDrag(float dx, float dy) { 
     mPosX += dx; 
     mPosY += dy; 
     invalidate(); 
    } 

    public void onScale(float scaleFactor) { 
     mScaleFactor *= scaleFactor; 

     // Don't let the object get too small or too large. 
     mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f)); 

     invalidate(); 
    } 
} 

}

+0

當你使用一個好的IDE(Eclipse或IntelliJ)時,可能很方便,點擊'this'或'super'會使你找到正確的構造函數。這有助於找出代碼的作用。 –

回答

3

在構造函數中,this()做一些事情比super()不同。調用this()推遲在同一個類中的重載構造函數。調用super()調用超類的構造函數。

在這裏,頭兩個TouchExampleView構造函數調用this通過傳遞默認值(s)來推遲到第三個構造函數。第三個構造函數調用super來調用超類的構造函數(另外做一些其他的事情)。

Java Language Specification, Section 8.8.7.1描述了這些調用。

顯式構造函數調用語句可以分爲兩種:

可選的構造調用這個 (可能帶有明確的類型參數的開頭)的關鍵字開頭。它們被用來調用 調用同一類的替代構造函數。

超類的構造函數調用以關鍵字super (可能以顯式類型參數開頭)或主 表達式開頭。它們用於調用超類的直接構造函數。

+0

現在你指出了這一點,這是非常有意義的。非常感謝! – user1532208

相關問題