![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_05.png?e8efa67)
お世話になっております。
匿名クラス内のメソッドをオーバーライドするときの引数についての質問なのですが
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 などの仮引数も謎です。
どうかよろしくご指導お願いいたします。
No.2ベストアンサー
- 回答日時:
File.javaを見てみることをお勧めするわ。
内部でacceptを呼び出しているから。
この回答への補足
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プログラマ」は記述する必要がない
という解釈でよろしいのでしょうか?
どうかよろしくご教授お願いいたします。
訂正です。
回答番号:No.2の補足の16行目
誤「JavaのコアAPIの作者」以外の「Javaプログラマ」は記述する必要がない
正「JavaのコアAPIの作者」以外の「Javaプログラマ」は自分で記述する必要がない
No.4
- 回答日時:
解釈はいい感じよ。
なぜOracleなのかがわからないけど。
後半に関してだけど
なんかすごい勘違いしているわよ。
list()メソッドは
Fileクラスのメソッドよ。
public String[] list() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkRead(path);
}
return fs.list(this);
}
こんな実装があるでしょ?
この回答への補足
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メソッドの実装はあなた側で自由に考えてよい
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");
}
が自動実行されるわけ。
これでどうかな?
この回答への補足
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);
と できるのか
謎です
どうかよろしくご教授お願いいたします。
回答番号:No.3の補足の補足
あなた側で
「acceptメソッドの実装」を考えてオーバーライドしてください
(オーバーライドのルールを守ってacceptメソッドの実装をあなた側で自由に考えてよい)
「あなた側で考えたacceptメソッドの実装(オーバーライド)」は以下の記述
return hoge.toString().endsWith(".txt");
No.1
- 回答日時:
この new で作ったオブジェクトに対して acceptメソッドを呼び出すときに与えられる.
この回答への補足
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);
引用ここまで
訂正
回答番号: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");}})が
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- その他(プログラミング・Web制作) Pythonで複数のメソッドをまとめて管理する方法について 1 2023/03/30 00:01
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 15:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Javaの関数名が長い?
-
Java初級 引数に適用できません
-
String.containsの反対機能はあ...
-
なぜprotected overrideなのか
-
メソッドの引数に指定されてい...
-
StringBufferからStringへキャ...
-
C# の ByVal と ByRef について
-
Java初心者です、エラーの意味...
-
return new使用時
-
getBinaryOutputStream()が使え...
-
Fileの読み取り専用の解除
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
インスタンス参照でアクセスで...
-
変数名の付け方
-
EXCEL VBAにて動的にCheckBOXを...
-
private static という変数の修飾
-
【sendkeysメソッドが動かずに...
-
変数の参照でエラーが出てしま...
-
多人数のじゃんけんプログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
レコード件数の表示
-
Java初級 引数に適用できません
-
String.containsの反対機能はあ...
-
abstract と static を一緒に付...
-
下記のリストならno002が含まれ...
-
Google Apps Script で getRang...
-
メソッド宣言の戻り値の型にク...
-
Strutsでチェックボックスの値...
-
StringBufferからStringへキャ...
-
readLine()ではじめから読み直...
-
javaに"search"という関数 or ...
-
なぜprotected overrideなのか
-
C# 点の描き方をおしえてくだ...
-
public static void main (Stri...
-
メソッドの引数に指定されてい...
-
別クラスのmainメソッドの実行
-
YYYYMMDD書式の日付に対する適...
-
C# の ByVal と ByRef について
-
Javaの関数名が長い?
-
Java初心者です、エラーの意味...
おすすめ情報