0

私はコーディングを2か月間学んでいます。私は Android プラットフォームで Java を使用しています。名前のないオブジェクトをよりよく理解しようとしています。

この例の 7 行目を参照すると、「this.button2.setOnClickListener(new OnClickListener(){...});」

a) OnClickListener はオブジェクトですか? (「new」キーワードが使用されていたので、そうだと思います)

b) 名前を付けることができますか?

c) どのように命名されますか?

d) 将来、それをどのように参照しますか? 出来ますか?必要に応じて、実行時に変更できますか?

e) これは機能しますか?: "this.button2.setOnClickListener(OnClickListener namedObject = new OnClickListener(){//methods go here});"

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main2);     
    this.button2 = (Button) this.findViewById(R.id.button2);    
    this.button2.setOnClickListener(new OnClickListener()   
    {
        public void onClick(View v) 
        {                       
            Intent i = new Intent(getApplicationContext(), Absolute.class);
            startActivity(i);
        }
    });
}
4

4 に答える 4

4

a)はい、オブジェクトです。

b)はい、名前を付けることができますが、必ずしもそうする必要はありません (将来参照する必要がない場合、または別の方法で参照する場合)。

c)次のことができます。

OnClickListener myOnClickListener = new OnClickListener() {
    // Contents of the OnClickListener go here...
}
this.button2.setOnClickListener(myOnClickListener);

d)名前を付けた場合 (上記のように)、名前で参照できます。オブジェクトで任意のミューテーター メソッドを呼び出すことによって参照がある場合は、実行時に参照できます。

e)その構文は無効です。この呼び出しを行う適切な方法については、(c) を参照してください。

于 2012-04-10T00:21:28.597 に答える
0

ご想像のとおり、OnClickListener はオブジェクトであり、匿名クラス/オブジェクトと呼ばれます。オブジェクト button2 の「コールバック」として使用されるため、名前を付ける必要はありません。これが意味することは、button2 にオブジェクトを渡しているということです。この場合、その作業はボタンがクリックされたときに発生するすべてです。

したがって、ボタンをクリックすると、ここで設定しているオブジェクトが呼び出されます。機能させるには、コード サンプルで行う「onClick」メソッドを定義する必要があります。そのメソッドがあるため、button2 はそれを呼び出して、指定したコードを実行できます。この場合、Intent オブジェクトを作成してアクティビティを開始します。

関数呼び出し内で宣言されているため、関数呼び出しが完了するとすぐにスコープ外になり、参照できなくなります。その理由で名前を付ける特別な理由はありません (button2 には、アクセスも気にする必要もない内部名が付けられます)。関数呼び出しの外でクラスを宣言すると、名前を付けて後で参照できますが、通常、これは必要ありません。

実行時に変更できると思いますが、必要でない限り、この複雑さは避けてください。

于 2012-04-10T00:21:50.037 に答える
0

これは、Java の無名クラスです。
名前を付ける必要はなく、もちろん名前を付けることもできますが、クラスが一度しか使用されない場合は、便宜上匿名クラスを使用できます。
新しい onclicklistener() は、この匿名クラスが onclicklistener から派生したことを意味します。
匿名クラスにいくつかのインターフェースを実装することもできます。

于 2012-04-10T00:24:50.293 に答える
0

を。OnClickListener は型 (抽象クラス/インターフェイス) であり、たまたま実装する必要のあるメソッドがありました。この場合、欠落しているメソッド「インライン」を実装しただけです。名前を付けることができます。しかし、あるべき姿などありません。それは選択の問題です。同じオブジェクトを複数回再利用する場合は、名前を付けることができます。

c. 次のようにインラインで実装することによって:

OnClickListener ocl = new OnClickListener() {
    public void onClick() {
       ...
    }
}

OR

public class MyOnClickListener extends OnClickListener {
    public void onClick() {
       ...
    }
}
OnClickListener ocl = new MyOnClickListener()

ここでは、OnClickListener が抽象クラスであると仮定しました。インターフェイスの場合は、extends という単語をimplements に変更するだけです。残りは同じままです。

d. 変数に代入すればそのまま参照できます。インラインで実装すると、実装を参照できません。

e. 引数に変数を代入することは無効です。

于 2012-04-10T00:30:14.383 に答える