現在、java初心者入門などの本で勉強しております
下記についてご教授お願い致します
コンストラクタ、interface、abstractの呼び出し順について質問なのですが、
下記プログラムを実行したところ(同一のパッケージ内に明記)

// インターフェイス
public interface interFaceClassSS {
   public void show();
}

public interface interFaceClassS {
   public void show();
}

// 抽象クラス
public abstract class ClassSSSab {
   // 共通のメソッドを実装
   //個々のメソッド
   abstract void show();
}

// スーパークラス
public class ClassSSS extends ClassSSSab{
   public ClassSSS(){
      System.out.println("ClassSSS");
      show();
   }
   public void show(){
      System.out.println("ClassSSSabの抽象メソッドを実装");
   }
}

public class ClassSS extends ClassSSS implements interFaceClassSS {
   public ClassSS() {
      System.out.println("ClassSS");
      show();
   }
   public void show() {
      System.out.println("interFaceClassSSを実装");
   }
}

// メイン処理
public class ClassS extends ClassSS implements interFaceClassS {
   public ClassS() {
      System.out.println("ClassS");
      show();
   }
   public static void main(String[] args) {
      new ClassSSS();
      System.out.println("");
      new ClassSS();
      System.out.println("");
      new ClassS();
   }
   public void show() {
   System.out.println("interFaceClassSを実装");
   }
}

// 結果
ClassSSS
ClassSSSabの抽象メソッドを実装

ClassSSS
interFaceClassSSを実装
ClassSS
interFaceClassSSを実装

ClassSSS
interFaceClassSを実装
ClassSS
interFaceClassSを実装
ClassS
interFaceClassSを実装

の結果となりました。
当方が望む結果は、

ClassSSS
ClassSSSabの抽象メソッドを実装

ClassSSS
ClassSSSabの抽象メソッドを実装
ClassSS
interFaceClassSSを実装

ClassSSS
ClassSSSabの抽象メソッドを実装
ClassSS
interFaceClassSSを実装
ClassS
interFaceClassSを実装

上記となります。

new ClassSSSの処理は当方が望む結果なのですが、
new ClassSSでは、
newClassSSSの結果に
ClassSS
interFaceClassSS
が追加されると理解していたのですが、結果は、
違っておりました。

どこに誤りがあるのが、数日検討したのですが、分からない状態です。
ご教授の程お願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

interFaceClassSを実装



スーパークラスのshowをオーバーライド

これで説明付くんじゃないかしら。
    • good
    • 0
この回答へのお礼

早々ご返答ありがとうございます

>interFaceClassSを実装
>→
>スーパークラスのshowをオーバーライド

interFaceClassSを実装するとのことですが、
ClassSにてinterFaceClassSのshow()メソッドを実装
したコーディングをしていると思っているのですが、
理解不足だと思いますので勉強しなおします。

望む結果の有無よりも、オーバーライドの学習不足だと
思うのですが、処理の流れが下記のとうり
だと思うのですが、間違いないでしょうか?

1.new ClassSSSの処理
  ClassSSSのコンストラクタ ClassSSSを表示
  show()は、ClassSSS.show()を呼び出す

2.new ClassSSの処理
  ClassSSSのコンストラクタ ClassSSSを表示
  show()は、ClassSSS.show()を呼び出すのではなく、
  ClassSS.show()によって、オーバーライドされる
  ClassSSのコンストクタ classSSを表示
  ClassSS.show()を呼び出す

3.new ClassSの処理
  2.と同様サブクラスによってshow()がオーバーライドされている   

上記だと、

// 結果
ClassSSS
ClassSSSabの抽象メソッドを実装

ClassSSS
interFaceClassSSを実装
ClassSS
interFaceClassSSを実装

ClassSSS
interFaceClassSを実装
ClassSS
interFaceClassSを実装
ClassS
interFaceClassSを実装

この結果になるな!と理解できます

上記の流れで間違いないなら、

サブクラスが、スーパークラスのコンストラクを読んだ場合、
サブクラスのメソッドがスーパークラスのコンストラクタに
明記しているメソッドをオーバーライドするとは、
認識していなかった点にありました

お礼日時:2009/05/13 18:51

スーパークラスのメソッドを呼び出したいときは、明示的に



super.show();

と実装しましょう。
    • good
    • 0
この回答へのお礼

回答して頂きありがとうございます。

ご指摘のとうり、明示的にsuperを実装しようと思います。

お礼日時:2009/05/13 19:35

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qlibpngのコンパイルについて。

今回、初めてMRTGサーバの構築を行う事になったので
すが、コンパイルの時点で行き詰ってしまいました。
http://www.mrtg.jp/doc/unix-guide.html
のサイトを参考にして、
/usr/local/bin/make -f scripts/makefile.std CC=/usr/local/bin/gcc ZLIBLIB=../zlib ZLIBINC=../zlib
とコマンドを打って実行したのですが、
make:ar:command not found
と言う様な結果がでてエラーでコンパイルできません。
make,gccは/usr/local/bin配下にインストールされて
います。
arというもののパスを探しても見つかりません。
arは事前にインストールが必要なのでしょうか?
どなたか分かる方、アドバイスお願い致します。
ちなみにlibpngのバージョンは1.0.18だったと思い
ます。

Aベストアンサー

>OSはSolaris8を使用しています。

それならば、バージョンは少し古いですが参考URLにあるサイトにパッケージがありますので、そちらからダウンロードしてインストールというのでもいいかもしれません。

参考URL:http://sunsite.sut.ac.jp/sun/solbin/

Qclass Test_A {  main(){}}の実行順序は?

public class Test_A {
public static void main(){

int a = 0;
int b = 1;

}
}
例えば上のようなサンプルで何故 main()がクラスTest_A の中に挟まっているのでしょうか?実行順序としては main()が終了したら、クラスTest_A の方はどうなるのでしょうか? main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。よろしくお願いします。 

Aベストアンサー

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時には、Test_Aクラスのインスタンスは生成されません。
質問のコードでは変数a,bに値が代入され、それで終わりです。

Javaでは、(正確にはJavaVMは)実行するclassファイルにある、
String[]引数を持ったvoid mainメソッドを実行する仕様になっています。
しかし、mainメソッドを実行するときには何のインスタンスも生成されていないので、
何かのインスタンスのメソッドを実行することはできません。
なので、staticなメソッドでないとJavaVMが実行できないのです。
さらに、JavaVMからアクセス可能なスコープを与える必要があるので、
publicである必要もあるのです。

あとは、そのmainメソッドに指定されたコードを実行し、mainメソッドの最後まで処理が進んだら
そこでJavaVMが終了し、プログラムも終了します。

※細かい話ですが、main()からプログラムは始まりません。
正確に言うと、引数なしのmain()メソッドは他のメソッドと何ら代わりがありません。
プログラムを始めるには、
アクセススコープがpublicで、staticな戻り値のなく、引数にString配列を取るmainメソッド
であることが必要です。つまり、
public static void main(String[] args)
とするのが通常です。
試しに質問のコードをjavaコマンドで実行すると、NoClassDefFoundErrorが出るはずです。

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時...続きを読む

Qプログラム作成(コンパイル、リンク)でのコマンド

プログラム素人です。
コンパイルオプション、あるいはコマンドなどいろいろとあり判らずにいます。
例えば、

$ gcc -fPIC -c xxx.c
$ gcc -shared -Wl,-soname,libxxx.so.1 -o libxxx.so.1.0 xxx.o
# cp libxxx.so.1.0 /usr/lib
# /sbin/ldconfig /usr/lib
# ln -s /usr/lib/libxxx.so.1 /usr/lib/libxxx.so
とか
$ ar rv libxxx.a xxx.o
$ ranlib libxxx.a
$ strip libxxx.a
など(ほんの一部だと思いますが)これらのコマンドの意味役割など知りたいのですが、書籍などありますでしょうか。
ネット上で検索してみましたがキーワードが悪いのかよいサイトに出会えません。

皆様、よいアドレス、書籍あればご紹介下さい。

Aベストアンサー

まず、実行ファイルを作成するには、最初にソースコードをコンパイルしてオブジェクトコードというものを作成し、複数のオブジェクトコードをリンクという処理を行います。

1. コンパイルについて

基本的には以下のコマンドでコンパイルできます。

$ gcc -c example.c

内部的には cpp によってプリコンパイル (構文解析) され、cc1 によってコンパイルされ、as によってオブジェクトコードになります。

ただし、共有ライブラリ (拡張子が .so のファイル) を作成する場合は、-fPIC オプションが必要になります。

$ gcc -fPIC -c example.c

2. リンクについて

(1) 実行形式ファイルの作成

$ gcc -o example example1.o ... examplen.o

シンボルテーブルを削除する場合はさらに、

$ strip example

とします。(strip するとファイルサイズを小さくすることができますが、デバッグができなくなってしまうので、基本的にライブラリは strip しません)

(2) 静的ライブラリの作成

$ ar cr libexample.a example1.o ... examplen.o
$ ranlib libexample.a
※ ar コマンドは tar のようなものと考えてもらえればと思います。

(3) 共有ライブラリの作成

$ gcc -shared -o libexample.so example1.o ... examplen.o

(4) 静的ライブラリや共有ライブラリの利用について

libexample1.so または libexample1.a
libexample2.so または libexample2.a

を利用する場合、

$ gcc -o example example.c -L/usr/local/lib -lexample1 -lexample2

-L オプションはライブラリが存在するディレクトリを指定します。ただし、/lib または /usr/lib にライブラリが存在する場合は -L オプションを指定する必要はありません。

また、特に何もオプションを指定しない場合で、静的ライブラリと共有ライブラリの両方が存在する場合は、共有ライブラリとリンクが行われます。

あとは、いろんなプログラムを make しまくって勉強して下さい。あまりこの分野の書籍がないのが実情です。

まず、実行ファイルを作成するには、最初にソースコードをコンパイルしてオブジェクトコードというものを作成し、複数のオブジェクトコードをリンクという処理を行います。

1. コンパイルについて

基本的には以下のコマンドでコンパイルできます。

$ gcc -c example.c

内部的には cpp によってプリコンパイル (構文解析) され、cc1 によってコンパイルされ、as によってオブジェクトコードになります。

ただし、共有ライブラリ (拡張子が .so のファイル) を作成する場合は、-fPIC オプションが必...続きを読む

QInteger.parseInt()について public static void main(String[] args) { int a =

初歩的な質問だと思うのですが、、、

public class TestTree {

public static void main(String[] args) {

int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);

GreatTree myTree = new GreatTree(a, b);
myTree.makeTree();
myTree.makeGround();
}

}

というプログラムについて、Integer.parseInt()はどういう意味を持つのかがわかりません。ただ適当につけた名前だとは思えないです。教えてもらえたら幸いです。お願いします。

Aベストアンサー

> argsで入力されたものは例え数字でも文字列として扱われているから、それをintにしている。ということですよね?

引数として (String[] args) と設定されていますので、
おっしゃるとおり 引数 args[]配列に入っているものは、文字列です。

ポイントは、 「String[]」でしょうか。。

Qソースコードのコンパイルについて

ソースコードのコンパイルについて

よくソースコードだけしか公開されていないソフトを見かけますが、これらはWindows, Mac, LinuxそれぞれでコンパイルすればそれらのOSで動くようになるのでしょうか?例えばCで書かれたソースコードをWindowsでコンパイルすればexeに自動的にコンパイルされ、MacでコンパイルすればMac用のバイナリに自動的にコンパイルされるのでしょうか?

またMacにはLinuxのシェルがあったと思うのですが、MacでコンパイルしたものはLinuxで動きますか?またその逆はできるのでしょうか。

Aベストアンサー

> よくソースコードだけしか公開されていないソフトを見かけますが、これらはWindows, Mac, LinuxそれぞれでコンパイルすればそれらのOSで動くようになるのでしょうか?

C言語で書かれたソースのみというソフトはほとんど見かけません。
Unix系のソフトだとconfigureやxmkmf・imakeなどを使って構築環境との整合をとりコンパイルする(コンパイルの前にシェルスクリプトやm4, makedependなどの前処理を行う)ソフトがほとんどなのでそれらの動く環境でないと構築は面倒です。


> 例えばCで書かれたソースコードをWindowsでコンパイルすればexeに自動的にコンパイルされ、MacでコンパイルすればMac用のバイナリに自動的にコンパイルされるのでしょうか?

C言語の教科書にでているようなコンソールアプリでC言語の規格のみ(言語仕様と標準ライブラリ)使っているようなソフトだとそういう事もありますが、通常のソフトは大抵様々な環境に依存した部分が含まれてますので公開されているソースコードの前提としている環境を整えて構築する必要があります。
同じWindows用といっても、xx C用のソースはyy Cではコンパイルできない(動かす為には一部を書き換える調整が必要)といった事もあります。


> またMacにはLinuxのシェルがあったと思うのですが、MacでコンパイルしたものはLinuxで動きますか?またその逆はできるのでしょうか。

MacはCMU Machを基盤に(NeXTからMac OS Xで色々カスタマイズされ変わっているでしょうが)、中間層にBSDを加えて作られているOSなのでMacでコンパイルしたものはLinuxでは動きません。

MacにはMac on LinuxというLinux互換環境がありますので、それを使えばLinuxで動くソフトも作れるでしょう。
※ Linuxの開発環境を整える必要はあるでしょうが。


Linuxと一言で書かれてますが、Linux同士でもコンパイル済みバイナリは使っているライブラリのバージョンが違えば動かなかったりするので動かす為には調整が必要な場合は多いですよ。
※ ソースから構築した方が良い。古いセキュリティリスクのあるかも知れないライブラリ入れたくはないだろうし、確認も面倒だし。

Linux同士であれMacのLinuxエミュレーション環境とLinuxであれ、コンパイル済みのバイナリを他のシステムで動かそうと思うとライブラリの調整などは必要となります。必ず手軽に動くとは考えない方が良いでしょう。
手間をかければ動かない事はないでしょうが。

> よくソースコードだけしか公開されていないソフトを見かけますが、これらはWindows, Mac, LinuxそれぞれでコンパイルすればそれらのOSで動くようになるのでしょうか?

C言語で書かれたソースのみというソフトはほとんど見かけません。
Unix系のソフトだとconfigureやxmkmf・imakeなどを使って構築環境との整合をとりコンパイルする(コンパイルの前にシェルスクリプトやm4, makedependなどの前処理を行う)ソフトがほとんどなのでそれらの動く環境でないと構築は面倒です。


> 例えばCで書かれたソースコード...続きを読む

Qpublic class Power {

public class Power {
static long pow(int a, int b){
if (b<=0)
return 1;
else
return a*pow(a,b-1);
}
public static void main(String args[]){
System.out.println(pow(1,3));
}
}

run:
1
BUILD SUCCESSFUL (total time: 0 seconds)

簡単な問題ですが。。。
僕の予想では答えは2でした

1 * (1, 2)
1 * 1 * 2
じゃないんですか?

Aベストアンサー

いえ、

pow(1,3)
= 1 * pow(1,2)
= 1 * 1 * pow(1,1)
= 1 * 1 * 1 * pow(1,0)
= 1 * 1 * 1 * 1 = 1です。

#ちなみに…例えば
pow(3,2)
= 3 * pow(3,1)
= 3 * 3 * pow(3,0)
= 3 * 3 * 1
= 9
となります(上記が1の4乗として計算されているんじゃなくて(1の3乗) * 1だという印象をつけたかったので例を出した)

QJavaのコンパイルについて

どうでもいいことかも知れませんが少し気になったので質問します。以下のようなプログラムを作成しました。
(1) Client.java
main()有り、main内でServerのインスタンス作成
(2) Server.java
main()無し、インターフェイスの定義のみ
(3) ServerImpl.java
main()有り、main内で自分自身(ServerImpl)のインスタンス作成

いつもはフォルダ内でjavac *.javaとコンパイルしてきたのですが、たまたま今日は一つずつコンパイルしてみました。一ファイルずつコンパイル出来るものかと思っていたのですがそうではなく、
(2)は単独でコンパイル出来る。
(1)と(3)は単独でコンパイル出来ない。((1)は(2)と同時にコンパイルする必要がある。(3)は(2)と同時にコンパイルする必要がある。)
であることを初めて知りました。つまり関連するクラスは一緒にコンパイルしなければならないということだと思うのですが、普通は関連するjavaファイルだけのMakefileをそれぞれ作るのでしょうか?それも大変だと思うのですが。。それともjavac *.javaのように一括でコンパイルするのが普通なのでしょうか?もし毎回全ファイルをコンパイルすると、修正のないものまでコンパイルしてしまうことになると思いますがそういうものなのでしょうか?質問がちょっと意味不明で恐縮ですが一人で小さなプログラムを作成したことしかないので、会社などで大規模なプログラムを作成している現場では普通どうやっているものか知りたくて質問しました。

どうでもいいことかも知れませんが少し気になったので質問します。以下のようなプログラムを作成しました。
(1) Client.java
main()有り、main内でServerのインスタンス作成
(2) Server.java
main()無し、インターフェイスの定義のみ
(3) ServerImpl.java
main()有り、main内で自分自身(ServerImpl)のインスタンス作成

いつもはフォルダ内でjavac *.javaとコンパイルしてきたのですが、たまたま今日は一つずつコンパイルしてみました。一ファイルずつコンパイル出来るものかと思っていたのですがそうで...続きを読む

Aベストアンサー

こんにちは。
コンパイルについてですが、そもそも、関連するソースを一緒にコンパイルする必要はありません。ただ、関連するソースをコンパイルしてできたクラスファイルは必要です。
つまり、
(1)をコンパイルする場合は(2)のクラスファイル(???.class)が必要です。(2)のクラスファイルをjavacコマンドのオプションのclasspathで設定してやると(1)単体でコンパイルできます。

また、(2)のファイルを編集した場合は、(1)と(3)のファイルもコンパイルし直した方が無難でしょう。

Eclipseなどは、それらの依存関係によって再コンパイルするファイルを決定していると思われます。

業務では、、、開発者のレベルではEclipseなどのIDEにコンパイルはまかせてしまってます。結合テストやそれ以降のテスト段階、本番環境への完成物のリリースをする際は、既出のantやmavenなどのビルドツールを使っています。Eclipseが不要になり、コマンドラインで利用できますから。

参考URL:http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/tooldocs/solaris/javac.html

こんにちは。
コンパイルについてですが、そもそも、関連するソースを一緒にコンパイルする必要はありません。ただ、関連するソースをコンパイルしてできたクラスファイルは必要です。
つまり、
(1)をコンパイルする場合は(2)のクラスファイル(???.class)が必要です。(2)のクラスファイルをjavacコマンドのオプションのclasspathで設定してやると(1)単体でコンパイルできます。

また、(2)のファイルを編集した場合は、(1)と(3)のファイルもコンパイルし直した方が無難でしょう。

Eclipseなどは、それら...続きを読む

Q"try{}catch(){}"文で"close()"はどのように書けばよいのでしょうか。

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プログラム1
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


●プログラム2
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


なお、私の環境は以下の通りです。
OS: Microsoft Windows XP Professional SP2
開発環境:Eclipse 3.2.2
java: java version "1.4.2_13"

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プロ...続きを読む

Aベストアンサー

>私のこの考え方は正しいのでしょうか。
正しいです。質問者さんが書かれているやり方が一般的です。
念のため書いておきますが、outをtryの外で宣言しないとコンパイルが通りません。

まぁ、あくまでデザインパターンを学ぶための本ですから、細かなコーディングについて気にする必要はないでしょう(疑問を持つことは良いことですが)。

Qコンパイルしたらマシン語になる?

基本的な質問かもしれないのですが:
●プログラミング言語をコンパイルしたらマシン語になるのでしょうか?
●マシン語になるとしたら、なぜ、Windowsのgccでコンパイルした実行ファイルはUnix上で動かないのでしょうか?

C言語などのプログラミング言語は人間が理解できる言葉で書かれていて、これをマシン(例えばIntelのCPU)が理解できる言葉に変換するのが「コンパイル」だと今まで私は理解していました。だから、IntelのCPU上でコンパイルした場合、他のCPUでは動かないのだと納得していました。

しかし、IntelのCPUが理解する言葉になるのであれば、WindowsでコンパイルしてもUnixでコンパイルしても IntelのCPUの言葉になっている点で変わりがないような気がします。しかし、Windowsでコンパイルした実行ファイルはUnixでは動かないですよね。私は根本的な勘違いをしていると思うのですが、それが何かを教えて頂けると幸いです。

Aベストアンサー

#3です。

> コンパイルした実行ファイルは
> (1)CPUに直接働きかける部分
> (2)OSの機能を使って、間接的にCPUに働きかける部分
> の両方を持っているのでしょうか?

他の方も書いていますが、実際のプログラムが動作する場合においては、両方が混じっています。
(2)の部分のイメージとしてですが、例えば
void main() {
printf("hello world");
}
といったプログラムを実行した場合を考えます。

これを実際に実行した場合、Unixではコンソール、Windowsではコマンドプロンプトに文字が出力されるわけですが、このそれぞれの画面に文字を出力する、という処理は各OSの機能によるものになります。

こういった部分があるため、OS依存性がでることになります。
また、stdio.hなどの基本機能とOS機能のなかだちをする処理が、コンパイルの中でもリンクといわれる処理になります。(・・・で、よかったと思います。)

QA a = new A(){}; の構文の意味が分からない。

下記サイトのコードを読んでいて、

ResponseListener listener = new ResponseListener() {
//略
};

という書き方があったのですが、どういう意味になるのでしょうか?
インスタンスの作り方は単に

A a = new A();

だと思うのですが…。

http://www.snmp4j.org/doc/org/snmp4j/Snmp.html

Aベストアンサー

無名クラスと呼ばれるものよ。
私も良くやるわ。

ちなみに
A a = new A();
はできないわよ。
Aはインターフェースだからね。


上記の場合、正式に実装するなら、
ResponseListenerをimplementsした
MyResponseListener(仮名)を別途作成し、
それを
ResponseListener listener = new MyResponseListener();
とする必要があるわ。
でも、このMyResponseListenerは
今ここでしか使わない、他からまったく参照する必要のない
超ローカルなクラスなのよ。
このメソッドが終了すればGCにかけてもいいわけ。
そんな場合、わざわざクラスを1つ作る必要なくて
その場でちょちょいとやってしまうことができるのよ。
それが無名クラスっていう実装方法よ。

http://www.javaroad.jp/java_class15.htm

FileFilterやCompare、Runnableなんかで
他のクラスで再利用しないときは良くやるわ。

無名クラスと呼ばれるものよ。
私も良くやるわ。

ちなみに
A a = new A();
はできないわよ。
Aはインターフェースだからね。


上記の場合、正式に実装するなら、
ResponseListenerをimplementsした
MyResponseListener(仮名)を別途作成し、
それを
ResponseListener listener = new MyResponseListener();
とする必要があるわ。
でも、このMyResponseListenerは
今ここでしか使わない、他からまったく参照する必要のない
超ローカルなクラスなのよ。
このメソッドが終了すればGCにかけても...続きを読む


人気Q&Aランキング