sebo
@sebo (山田 せぼんぬ)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Java thisの使い方

thisとMainActivity.thisとの書き分けがわかりません

ボタンクリック判定でボタンをクリックした後トーストを表示するプログラムを、リスナーで記述した場合と匿名クラスで記述した場合で()内の指定方法が違っていました。
thisとMaintActivity.thisでなぜ指定方法が違うのでしょうか?

リスナーを使ったボタンクリック判定(this)

    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Button btn2=findViewById(R.id.button2);
            btn2.setOnClickListener(this);
    }
    @Override
    public void onClick(View v){
        if(v.getId()==R.id.button2){
            Toast.makeText(this,"押された",Toast.LENGTH_SHORT).show();
            //thisが使われている
        }
    }

匿名クラスを使ったボタンクリック判定(MainActivity.this)

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this,"押された",Toast.LENGTH_SHORT).show();
                //MainActivity.thisが使われている
            }
        });

    }
0

1Answer

thisが指すものを整理すればご理解いただけるかと思います.
new View.OnClickListener匿名クラス内から見てthisが指すものはこの匿名クラスです.(匿名クラスでは,インスタンスを新たに生成していることに注意してください)
匿名クラス内から親のthisを参照したい場合,Javaでは[クラス名].thisの記法を使用して特定することができます.

OnClickListenerインターフェースを実装する場合は,thisの参照する先はもともとMainActivityのものなので,クラス名の指定は必要ありません.

1Like

Comments

  1. @sebo

    Questioner

    なるほど!匿名クラスではインスタンスを生成しているためthisの指すものが変わっていたんですね。
    とっても丁寧でわかりやすい解説ありがとうございます!!

Your answer might help someone💌