お世話になっております。
匿名クラス内のメソッドをオーバーライドするときの引数についての質問なのですが
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Java初級 引数に適用できません
-
YYYYMMDD書式の日付に対する適...
-
メソッドの引数に指定されてい...
-
String.containsの反対機能はあ...
-
Java初心者です、エラーの意味...
-
シェルスクリプトからのJavaメ...
-
親の親のメソッドを呼ぶには?
-
C# 他のnamespaceにあるメソッ...
-
Google Apps Script で getRang...
-
Fileの読み取り専用の解除
-
C# の ByVal と ByRef について
-
レコード件数の表示
-
実行中のメソッド名
-
staticのメリット、デメリット
-
.get○○Info(); メソッド につ...
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
UMLのクラス図はmain()も含むん...
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Java初級 引数に適用できません
-
String.containsの反対機能はあ...
-
レコード件数の表示
-
StringBufferからStringへキャ...
-
C# 点の描き方をおしえてくだ...
-
Google Apps Script で getRang...
-
YYYYMMDD書式の日付に対する適...
-
C# でメソッドに送られてきたOb...
-
なぜprotected overrideなのか
-
Java初心者です、エラーの意味...
-
Strutsでチェックボックスの値...
-
メソッド宣言の戻り値の型にク...
-
abstract と static を一緒に付...
-
return new使用時
-
Javaの関数名が長い?
-
メソッドの引数に指定されてい...
-
クラスを作るとメソッドの数が...
-
public static void main (Stri...
-
説明文書でのメソッド・変数の...
-
readLine()ではじめから読み直...
おすすめ情報