匿名クラス内のメソッドをオーバーライドする際の引数について

このQ&Aのポイント
  • 匿名クラス内でメソッドをオーバーライドする際の引数について質問があります。
  • オーバーライドしたacceptメソッドの仮引数のFile型のhogeの実引数はいつどこから来るのでしょうか?
  • acceptメソッドの実引数はどこで指定すればよいのでしょうか?他の仮引数についても分からないです。
回答を見る
  • ベストアンサー

匿名クラス内のメソッドをオーバーライド。実引数はいつどこから来るのでしょうか?

 お世話になっております。 匿名クラス内のメソッドをオーバーライドするときの引数についての質問なのですが File d = new File("F:\\dir"); File[] d2 = d.listFiles(new FileFilter(){ public boolean accept(File hoge){ return hoge.toString().endsWith(".txt"); } } ); オーバーライドしたacceptメソッドの仮引数のFile型のhogeがありますが このacceptメソッドの実引数はいつどこから来るのでしょうか? このacceptメソッドの実引数はどこで「acceptメソッドの呼び出し」で指定すればよいでしょうか? その他ActionEvent e などの仮引数も謎です。 どうかよろしくご指導お願いいたします。

noname#179638
noname#179638
  • Java
  • 回答数4
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.2

File.javaを見てみることをお勧めするわ。 内部でacceptを呼び出しているから。

noname#179638
質問者

お礼

訂正です。 回答番号:No.2の補足の16行目 誤「JavaのコアAPIの作者」以外の「Javaプログラマ」は記述する必要がない 正「JavaのコアAPIの作者」以外の「Javaプログラマ」は自分で記述する必要がない

noname#179638
質問者

補足

 askaaskaさま、ご教授ありがとうございます。 jdk-6u18-fcs-src-b07-jrl-17_dec_2009.jar をインストールし、 インストールしたフォルダ\j2se\src\share\classes\java\io\File.java の1134行目に「acceptメソッドの呼び出し」の記述を発見しました(listFilesメソッドの定義の中)。 これは 「acceptメソッドの呼び出し」は 「JavaのコアAPI」に記述があるので 「JavaのコアAPIの作者」以外の「Javaプログラマ」は記述する必要がない という解釈でよろしいのでしょうか? どうかよろしくご教授お願いいたします。

その他の回答 (3)

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.4

解釈はいい感じよ。 なぜOracleなのかがわからないけど。 後半に関してだけど なんかすごい勘違いしているわよ。 list()メソッドは Fileクラスのメソッドよ。   public String[] list() {     SecurityManager security = System.getSecurityManager();     if (security != null) {       security.checkRead(path);     }     return fs.list(this);   } こんな実装があるでしょ?

noname#179638
質問者

お礼

 質問そのものは解決いたしました。 askaaska様、ありがとうございました。

noname#179638
質問者

補足

 askaaskaさま、ご教授ありがとうございます。 return fs.list(this); これはjava.io.FileSystemクラスのlist()メソッドの呼び出しでは? FileSystem.java内に public abstract String[] list(File f); abstractメソッドなのにどこでlistメソッドを実装(オーバーライド)しているのでしょうか? どうかよろしくご教授お願いいたします。 回答番号:No.3の補足の補足の補足 あなた側で 「acceptメソッドの実装」を考えてオーバーライドしてください (オーバーライドのルールを守ってacceptメソッドの実装をあなた側で自由に考えてよい) 「あなた側で考えたacceptメソッドの実装(オーバーライド)」は以下の記述 return hoge.toString().endsWith(".txt"); 上記の記述はあくまでも文例でありacceptメソッドの実装はあなた側で自由に考えてよい

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.3

これはJavaのインターフェースや抽象クラスを理解していないと なかなか難しいと思うわ。 でも、これらを理解していればそれほど難しいことじゃないんだけど。 File#listFilesでは そのディレクトリ以下のファイルの一覧を取得後 ループでそのファイル1個1個について FileFilter#acceptメソッドを呼んでいるわね? ここまでOK? ここで使っているFileFilterは File#listFilesの引数で渡されてきたFileFilterである。 具体的には new FileFilter(){  public boolean accept(File hoge){   return hoge.toString().endsWith(".txt");  } } こんな実装の匿名クラスだけど。 ここまでOK? つまり、File#listFiles内で実行されるacceptは  public boolean accept(File hoge){   return hoge.toString().endsWith(".txt");  } これなのよ。 ここまでOK? 結論、File#listFilesを実行すると 引数で渡された  public boolean accept(File hoge){   return hoge.toString().endsWith(".txt");  } が自動実行されるわけ。 これでどうかな?

noname#179638
質問者

お礼

回答番号:No.3の補足の補足 あなた側で 「acceptメソッドの実装」を考えてオーバーライドしてください (オーバーライドのルールを守ってacceptメソッドの実装をあなた側で自由に考えてよい) 「あなた側で考えたacceptメソッドの実装(オーバーライド)」は以下の記述 return hoge.toString().endsWith(".txt");

noname#179638
質問者

補足

 askaaskaさま、ご教授ありがとうございます。 インターフェースや抽象クラスについては存じ上げております。 StringクラスのendsWithメソッドの戻り値はboolean型 public boolean accept(File hoge){   return hoge.toString().endsWith(".txt");  } がabstractなFileFilterクラスの public abstract boolean accept(File f) メソッドの実装(オーバーライド)であることも存じ上げております。 File#listFilesの実引数で渡すFileFilterは 「abstractなFileFilterクラスの匿名サブクラス(継承)」を宣言して acceptメソッドの実装(オーバーライド)をして その「FileFilterクラスの匿名サブクラス」を直ちにnewしている ことも存じ上げております。 解釈ここから 「JavaのコアAPIの作者以外のJavaプログラマ」=あなた 「JavaのコアAPIの作者」=Oracle あなた側で 「JavaのコアAPIのFile.java(Fileクラス)内のstaticではないlistFilesメソッド」を呼び出すときは Oracle側で 「acceptメソッドの呼び出し」を行うので あなた側で 「acceptメソッドの実装」を考えてオーバーライドしてください このとき あなた側で 「FileFilterクラスの匿名サブクラス(継承)」を宣言して 「あなた側で考えたacceptメソッドの実装(オーバーライド)」をして その「FileFilterクラスの匿名サブクラス」を直ちにnewして それを 「listFilesメソッドの実引数」にしてください 解釈ここまで この解釈でよろしいのでしょうか? JavaのコアAPIのFile.java内のstaticではないlistFilesメソッドの定義の中 filter.accept(f) acceptメソッドの実引数fはJavaのコアAPIのFile.java内のstaticではないlistFilesメソッドの定義の中でFile型のfがnewされる記述を発見済み File f = new File(ss[i], this); ss[i]はlistFilesメソッドの定義の中で String ss[] = list(); があり JavaのコアAPIのFile.java内に public String[] list() {略} メソッドの定義があり これはオーバーライドではないと思われる public class File extends Object implements Serializable, Comparable<File> Objectクラスにlist()メソッドは無いため ComparableはcompareToのみのオーバーライド Serializableはオーバーライドの概念が無い 同メソッドの戻り値は return fs.list(this); JavaのコアAPIのFile.java内の127行目に static private FileSystem fs = FileSystem.getFileSystem(); があり jdk-6u18-fcs-src-b07-jrl-17_dec_2009.jar をインストールし、 インストールしたフォルダ\j2se\src\share\classes\java\io\FileSystem.java JDK 6 ドキュメントにも載ってない謎のクラス java.io.FileSystem abstract class FileSystem public static native FileSystem getFileSystem(); OS側のファイルシステムをnativeメソッドで呼び出している? FileSystem.java内に public abstract String[] list(File f); File.javaはなぜオーバーライドしていないlistメソッド を使って return fs.list(this); と できるのか 謎です どうかよろしくご教授お願いいたします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

この new で作ったオブジェクトに対して acceptメソッドを呼び出すときに与えられる.

noname#179638
質問者

お礼

訂正 回答番号:No.1の補足の1行目 誤 listFilesメソッド(JavaのコアAPIのj2se\src\share\classes\java\io\File.java内にlistFilesメソッドの定義がある)のFileFilter型の仮引数のfilterが 正 listFilesメソッド(JavaのコアAPIのj2se\src\share\classes\java\io\File.java内にlistFilesメソッドの定義がある)のFileFilter型の仮引数のfilter(実引数はFileFilter型のサブクラス型でこの実引数は「JavaのコアAPIの作者」以外の「Javaプログラマ」が自分で記述する。質問の例ではnew FileFilter(){ public boolean accept(File hoge){ return hoge.toString().endsWith(".txt");}})が

noname#179638
質問者

補足

listFilesメソッド(JavaのコアAPIのj2se\src\share\classes\java\io\File.java内にlistFilesメソッドの定義がある)のFileFilter型の仮引数のfilterが (JAVA RESEARCH LICENSEですが事件番号 昭和51年(オ)第923号 パロディ事件 (昭和55年)3月28日 最高裁第三小法廷 の判例上 引用は問題ないかと思います) 引用ここから 出所の明示 著作者名 Sun Microsystems(現在のOracle) filter.accept(f) 引用ここまで を呼び出すようです。 上記acceptメソッドの実引数fはJavaのコアAPIのFile.java内のstaticではないlistFilesメソッドの定義の中でFile型のfがnewされる記述を発見済み ↓その記述はコレ(JAVA RESEARCH LICENSEですが事件番号 昭和51年(オ)第923号 パロディ事件 (昭和55年)3月28日 最高裁第三小法廷 の判例上 引用は問題ないかと思います) 引用ここから 出所の明示 著作者名 Sun Microsystems(現在のOracle) File f = new File(ss[i], this); 引用ここまで

関連するQ&A

  • 実体化したクラスを関数の引数にするには

    タイトルの通りです。 実体化したクラスを関数の引数として渡し、 関数の中でクラスのメソッドを実行したいと思っています。 以下のソースではエラーが出るのですが、 お分かりの方はいらっしゃいますでしょうか? $o_hoge = new Class_hoge(); fncHoge = ($o_hoge); function fncHoge($class) {  $class->hoge('test'); } class Class_hoge {  public function hoge($a)  {   print $a;  } }

    • ベストアンサー
    • PHP
  • Android / AsyncTaskの第1引数

    ■コード Hoge hoge = new Hoge(); hoge.execute(); public class Hoge extends AsyncTask<Object, 第2引数, 第3引数> {  protected List<Piyo> doInBackground(Object... params) { ■質問1 ・executeで引数を渡していないに、なぜ引数を受け取れるのでしょうか? (doInBackgroundメソッド引数として受け取っているで合っている?) ・処理の流れ的には、executeで渡した引数がdoInBackgroundメソッド引数となり、その型をAsyncTask第1引数で指定している? ・それとも、executeで渡す引数の型をAsyncTask第1引数で指定しているから、予め指定された型のみをdoInBackgroundメソッド引数として受け取れる? ■質問2 ・リンク先に、下記主旨の記述があるのですが、「自分で好きに型を選択できる」とはどういう意味なのでしょうか? >冒頭の型変数のParamsはdoInBackgroundメソッドの引数で、自分で好きに型を選択できる >execute()メソッドの引数に渡されたものがこのdoInBackgroundのparamsとして渡ってくる ・paramsとして渡された型を、AsyncTask第1引数で宣言することで自由に変更できる? ・それとも、AsyncTask第1引数で指定することで、doInBackgroundのparamsとして渡されてくる型を制限(指定)できる? http://d.hatena.ne.jp/Nagise/20120309/1331265123

    • ベストアンサー
    • Java
  • mainメソッドの引数

    Javaのプログラミングを練習しています。 下記のような問題があり、プログラムを組んでみたのですが 何か足りないようで思うような処理ができません。 ご教授頂けたら幸いです。 宜しくお願いします。 main()メソッドの引数で指定された名前のファイルに、キーボードから入力された内容を1行ずつ(上書きモードで)書き込むプログラムを作成して下さい。 (キーボードからの入力内容がない(空文字列の)場合にはプログラムを終了させて下さい) ただし、引数の個数が1個でない場合には「ファイル名を正しく指定して下さい」と表示して、プログラムを異常終了させて下さい。 又、処理の途中で例外が発生した場合には、発生した例外の内容を表示して、プログラムを異常終了させて下さい。 import java.io.*; public class Sample101 { public static void main(String[] args) { BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); try{ PrintWriter fout = new PrintWriter(new BufferedWriter(new FileWriter("text1.txt"))); System.out.print("ファイルに書き込む文字列を入力して下さい >"); String s1 = br.readLine(); fout.println(s1); fout.close(); } catch(Exception e){ System.out.print("ファイル名を正しく指定して下さい"); System.exit(1); } } }

    • ベストアンサー
    • Java
  • Ruby 特異メソッドのnewが先に実行?

    Rubyのインスタンス生成について質問があります。 通常クラスを定義する場合は class Hoge ; def hello(); pirnt "hello"; end であると思います。 ただ Hoge = Class.new(); でもクラスは定義できるとききました。 ただこの場合Hogeクラスに定義できるのは HogeというClassクラスから作られた特異クラスとしてのHogeに 特異メソッドのみを定義できるということですよね? 通常のインスタンスメソッドは定義できませんよね? ではでは、 hoge = Class.new(); とした場合はどうなるのでしょうか? この場合は Classクラスの純粋なインスタンスとなるのでしょうか? 前者の定義とおなじ仕方ですが代入先が、通常の変数です。 この場合は、クラスオブジェクトとして生成されるのですか? オンラインマニュアルをみたところ 「新しく名前の付いていない superclass のサブクラスを生成します。 superclass が省略された時にはObject のサブクラスを生成します。 名前のないクラスは、最初に名前を求める際に代入されている定数名を検索し、見つかった定数名をクラス名とします。」 とあります。 上記内容は Classクラスの特異クラスとして定義されている特異メソッド(new)です。 これは Class.new()で作られたインスタンスを代入する先が定数であればその定数名と同じクラスを定義しつつそのClassクラスのクラスオブジェクトを生成するという意味合いでまちがいないでしょうか? 上記のとおりであれば hoge =Class.new()の場合は、やはりhogeというクラスを定義することになるのでしょうか? クラス定義は定数でなければならないはずですよね。 ただ実際、 p hoge;として出力すると#とひょうじされています。これはhogeがクラスオブジェクトではなく ただのインスタンスであるということでしょうか? であるならばこの hoge = Class.new()の式のnewはClassクラスオブジェクトに定義された特異メソッドではなく Classクラスに定義されたnewメソッド・・・・・つまりClassクラスに定義されたインスタンスメソッドの方のnewメソッドだとおもうのですが・・・・・・。 つまりこちらのメソッドですね。 「new( ... ) クラスのインスタンスを生成して返します。このメソッドの引数はブロック引数も含め initialize に渡されます。」 ※オンラインリファレンスから参照しました。 しかし 通常メソッドの検索は特異メソッドからはじまりその後クラスのインスタンスメソッド->親クラスのメソッドと 検索して行くとあります。 必ず先に、特異メソッドを実行しているはずだと思うのですが・・・。 やはり特異メソッドnewを実行しているのでしょうか? 長々すみませんが、ご教授ください。

    • ベストアンサー
    • Ruby
  • メソッドにより複数の情報を得たい場合

    例えば、他のクラスのメソッドに何らかのインスタンス配列を渡してやって、その中から何らかの基準で選択して要素を返すようなメソッドを考えます。 さらに、同時に配列のどの位置が選ばれたのかを知りたい場合は、みなさんならばどう対処しますか? class Hoge{} class A {  public Hoge select(Hoge h[]){   return h[(int)(Math.rand()*h.length)];  } } class Test{  public static void main(String argv[]){   A a = new A();   Hoge hoge[] = new Hoge[100];   Hoge h = a.select(hoge);//同時にどの位置が選択されたかも知りたい  } } 上の例だと、「最初から選択された位置を返して、それからHogeインスタンスを得ればいいじゃないか」という話もごもっともなのですが、もし仮にJavaがポインタを許すと仮定した場合の Hoge select(Hoge h[], int *n){   return h[*n = (int)(Math.rand()*h.length)]; } Hoge h = select(hoge, &idx); に代わるような方法はないものかなぁ。。 という素朴な疑問から質問をしてみました。 考え付いた方法は、サイズ1のint配列を引数に渡して値をセットするか, 欲しい値などをメンバにもつクラスを定義してやって、それを select から返す方法か・・くらいです。 みなさんならこういった場合(メソッドにより取得したい値がいっぱいある場合) 、どうしますか?

    • ベストアンサー
    • Java
  • javaのオーバーライドについての質問です。

    *  クラスParent04に受け取ったString配列の中身を全て大文字に変換するChangeメソッドが定義されています。クラスParent04を継承するクラスChild04でChangeメソッドを  オーバーライドして、String配列の中身を全て小文字に変換するように変更してください。  その後クラスOverRide04のmainメソッドからChangeメソッドを呼び出して、  変換後のString配列の要素を全て出力してください。 */ // オーバーライドされるので覆い隠される class ORParent04{    public String[] Change(String[] strArray){       int len = strArray.length;      String[] Array = new String[len];      for(int i = 0; i < len; i++){       Array[i] = strArray[i].toUpperCase();      }      return Array;   } } // ORParent04クラスを継承し、ORChild04でオーバーライド // こちらが適用される。 class ORChild04 extends ORParent04{    //ここからプログラムを追加してください。    public String[] Change(String[] strArray){       int len = strArray.length;       String[] Array = new String[len];       for(int i = 0; i < len; i++){                   // toLowerCaseで小文字に変換         Array[i] = strArray[i].toLowerCase();       }       // 値を返す       return Array;    } } class OROverRide04{   public static void main(String[] args){        // ORChild04クラスのインスタンス化     ORChild04 ORchild04 = new ORChild04();       //ここからプログラムを追加してください。     // Changeメソッドの呼び出し:戻り値String[],引数String[]      String[] array = ORchild04.Change(String[] args);          // 表示      System.out.println(array);   }  } このような問題で、現在これをコマンドプロンプトでコンパイルすると、mainメソッド内のString[] array = ORchild04.Change(String[] args);メソッド呼び出し部分が指定され、 「'.class'がありません」 「;がありません」 という2つのエラーが表示されます。ネットでエラー表記の意味を検索し、コードを確認しましたが、「{}」と上記より上の行の;が特に抜けている、という訳ではありません。勿論自分が何か見落としている為にコンパイルエラーになるのですが、戻り値と引数の値は合わせているので、心情としては「動けジ・O!何故動かん!?」という具合です。 どなたか考え方やヒントなどお願い致します。後もう少しだと思うのですが。。。

    • ベストアンサー
    • Java
  • クラスメソッドについて

    Kakeibo クラスにあるsyojikin(初期値0)をprivate フィールドとし、その代わりにクラスメソッドshowSyoji(戻り値、引数無し)を用意して、下記のプログラムを作成したのですがクラスメソッドのshowSyojiがうまく回りません。これはもしかしてクラス変数も必要なのですか(privateもつけて)?また、このプログラムはどのようなプログラムになるのですか? class Kakeibo { private int year; private int month; private int date; private int syunyu; private int shisyutsu; private int syojikin; private Kakeibo() { year = 0; month = 0; date = 0; syunyu = 0; shisyutsu = 0; syojikin = 0; } public Kakeibo(int y, int m, int d, int sy, int sh) { this(); if(sy>=0 && sh>=0){ year = y; month = m; date = d; syunyu = sy; shisyutsu = sh; } else{ System.out.println("入力した金額は無効です。"); } } public static void showSyoji() { System.out.println("所持金:"+syojikin+"円"); } public void showData() { System.out.print(year+"年"+month+"月"+date+"日:収入"+syunyu+"円、支出"+shisyutsu+"円\n"); } } class KNO5 { public static void main(String args[]) { Kakeibo.showSyoji(); //Kakeibo kakeibo1 = new Kakeibo(); //kakeibo1.showData(); Kakeibo kakeibo2 = new Kakeibo(2010, 12, 1, 3000, 500); kakeibo2.showData(); Kakeibo kakeibo3 = new Kakeibo(2010, 12, 1, -5000, 300); kakeibo3.showData(); Kakeibo kakeibo4 = new Kakeibo(2010, 11, 7, 0, 1000); kakeibo4.showData(); Kakeibo kakeibo5 = new Kakeibo(2010, 11, 18, 100, 800); kakeibo5.showData(); Kakeibo.showSyoji(); } }

    • ベストアンサー
    • Java
  • Javaの質問です(引数の中でメソッド定義?)

    お世話になります。 現在、Javaについて勉強しておりまして一つ不明な点があり投稿させていただきました。 まずはソースをご覧ください。 ---------------------------------------------------------------------------------------------- button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Main.this, Editor.class); TextView textView = (TextView)findViewById(R.id.TextView01); CharSequence text = textView.getText(); intent.putExtra("TEXT", text + "000"); startActivityForResult(intent, SHOW_EDITOR); } }); ---------------------------------------------------------------------------------------------- 上記はサンプルプログラムから一部抜粋したものですが button.setOnClickListenerの引数でnew演算子を使用しており、 尚かつonClickメソッドをオーバーライドして定義しています。 C++開発経験者の私としては非常に見づらいのですが、こんな書き方って結構使うんでしょうか? これがイマイチ理解できていません。 この書き方をネットで探しても見つからなかったため、こちらでご質問させていただきました。 どなたかご教授願います。

  • メソッド(Object... params)

    ■環境 Android(Java) ■前提 HogeClass hoge = new HogeClass(); hoge.execute();  public class HogeClass extends AsyncTask<Object, Integer, List<Item>> {   @Override   protected List<Item> doInBackground(Object... params) { ・引数の「...」初めて見ました ・調べたら、可変長引数、と書いていました ■質問1 ・「...右のparams」は、ユーザーが任意でつけて良い文字列でしょうか? ■質問2 ・executeで引数指定していないので、doInBackgroundには引数は渡っていない、と考えて良いでしょうか? ■質問3 ・executeで引数指定していないのにdoInBackgroundで可変長引数対応している理由は、このメソッド元である抽象メソッド「doInBackground (Params... params)」が可変長引数形式になっているためでしょうか? http://developer.android.com/reference/android/os/AsyncTask.html#doInBackground(Params...) ■質問4 ・この場合の「AsyncTask<Object」は何をしているのでしょうか? ・可変長引数で、0個以上の引数を受け付ける際、その型がObjectであることを保障しているだけでしょうか? ・つまり、絶対にObject型の引数を渡すなら、この記述は省略しても良いのでしょうか? ■質問5 ・ジェネリクスの使い所について ・型を絶対に保障したい時ってどんなときでしょうか? ・基本的にどんな時でも型は保障した方が良いと思うのですが、そうするとジェネリクスだらけにならない?

    • ベストアンサー
    • Java
  • 違うコントロールビューからのメソッドが使用可能か?

    Xcode objective-cの質問なのですが、 違うコントロールビューからメソッドを呼び出して使う方法ってありますか? JAVAでいうと、違うクラスのメソッドも呼べるような感じで。 (例) DifferentClass d = new DifferentClass(); int a = d.differentMethod(); こんな感じの使い方がしてみたい↓ GameViewController classの中で、 ViewController v = switchValue(); boolean a = v.switchValue();

専門家に質問してみよう