質問: android inflateメソッドについて eclipseから「新規アプリケーション・プロジェクト」でプロジェクトを作成すると下記のコードが自動作成されます。 package com.example.hello; import android.os.bundle; import android.app.activity; import android.view.menu; public class mainactivity extends activity { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); } @override public boolean oncreateoptionsmenu(menu menu) { // inflate the menu; this adds items to the action bar if it is present. getmenuinflater().inflate(r.menu.main, menu); return true; } } この中で、inflateメソッドにカーソルを当てると void android.view.menuinflater.inflate(int menures, menu menu) が表示されるので、menuinflaterクラスのメソッドだと確認できます。 しかし、import文でmenuinflaterクラスを定義していないのになぜ使用できるのでしょうか。
回答: importというのは、単に「クラスの検索対象」を設定するだけです。クラスを利用する場合、本来ならば、例えばandroid.view.menuinflaterというようにパッケージまで全て書かないといけません。が、これは面倒です。そこで import android.view.menuinflater;としておくことで、menuinflaterというクラス名を書くだけでandroid.view.menuinflaterが検索されるようになる、ということなのです。ですから、 >import文でmenuinflaterクラスを定義していないのになぜ使用できるのでしょうか。 このソースコードでは、menuinflaterというクラスは使われていません。ただ単に、menuinflaterインスタンスを返すメソッドを呼び出し、その返値のインスタンス内のメソッドを呼び出しているだけです。menuinflaterというクラスを検索する必要がないのでimport文は不要です。 何かのクラスのインスタンスを返すメソッドを利用するとき、その返すクラスをimportしなくともそのメソッドは使えますし返されるインスタンスも使えます。返されるインスタンスは、それがどのクラスのインスタンスかわからない、なんてことはないからです。必ず、そのメソッドを定義するところで、「このパッケージにあるこのクラスのインスタンスが返される」と指定されていますから。 importが必要なのは、あくまで「指定したクラスが、クラス名だけではわからない場合」のみです。そのような場合にのみ、「このパッケージにあるこのクラスを使うんだよ」とimportで教えておくのです。