- 締切済み
Java:クラスのインスタンスを配列の要素にする?
問題集で次のプログラムを見掛ました。 A[] array = {new B(), new C()}; クラスA型の配列変数arrayにクラスBとクラスCのインスタンスを要素として代入しています。 このような配列を作成した場合、具体的にどのような使い方があるのでしょうか? 簡単なプログラムを書いて頂けると嬉しいです。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- amanojaku1
- ベストアンサー率54% (265/488)
>>セキュリティーの強化によりアプレットに電子署名を付けるか、またはユーザーが下記の設定をしないとアプレットが表示できなくなりました。 >> >>WebブラウザでJavaを有効にするには >>https://java.com/ja/download/help/enable_browser.xml >> >>Java「セキュリティ設定によってブロックされたアプリケーション」の解除方法 >>http://www.geocities.co.jp/Playtown-Yoyo/6130/notes/virus-java-security.htm >> >>例外サイト・リストに このサイトのトップ・アドレスの「http://artemis.rosx.net/」を設定して下さい。 >申し訳ございません、ちょっとアドレスを変更してしていました、(効率が悪いので)表示に少々 時間がかかる場合があります。 >http://artemis.rosx.net/museum/myapplet/Figure0K/AppFigure0K.htm なんかサーバーの調子が悪いのか正常に表示できないようです、下記アドレスにもアップしました、(効率が悪いので)表示に少々 時間がかかる場合があります。 http://pleiades1335.x1xhosting.com/museum/myapplet/Figure0K/AppFigure0K.htm 例外サイト・リストに このサイトのトップ・アドレスの「http://pleiades1335.x1xhosting.com/」を設定して下さい。
- amanojaku1
- ベストアンサー率54% (265/488)
>どうもclassファイルをJARに圧縮するとアプレットが表示できなくなるようだ(^_^;) JARファイルは電子署名でも付けろと言う事だろうか? >下記はJARに圧縮してないclassファイル群のアプレットです(JARに圧縮してないので効率が悪い)。 >http://artemis.rosx.net/museum/myapplet/AppFigure0K/AppFigure0K.htm > >セキュリティーの強化によりアプレットに電子署名を付けるか、またはユーザーが下記の設定をしないとアプレットが表示できなくなりました。 > >WebブラウザでJavaを有効にするには >https://java.com/ja/download/help/enable_browser.xml > >Java「セキュリティ設定によってブロックされたアプリケーション」の解除方法 >http://www.geocities.co.jp/Playtown-Yoyo/6130/notes/virus-java-security.htm > >例外サイト・リストに このサイトのトップ・アドレスの「http://artemis.rosx.net/」を設定して下さい。 申し訳ございません、ちょっとアドレスを変更してしていました、(効率が悪いので)表示に少々 時間がかかる場合があります。 http://artemis.rosx.net/museum/myapplet/Figure0K/AppFigure0K.htm
- amanojaku1
- ベストアンサー率54% (265/488)
>古いJavaでコンパイルしているせいか?、アプレットとして実行できません。 どうもclassファイルをJARに圧縮するとアプレットが表示できなくなるようだ(^_^;) JARファイルは電子署名でも付けろと言う事だろうか? 下記はJARに圧縮してないclassファイル群のアプレットです(JARに圧縮してないので効率が悪い)。 http://artemis.rosx.net/museum/myapplet/AppFigure0K/AppFigure0K.htm セキュリティーの強化によりアプレットに電子署名を付けるか、またはユーザーが下記の設定をしないとアプレットが表示できなくなりました。 WebブラウザでJavaを有効にするには https://java.com/ja/download/help/enable_browser.xml Java「セキュリティ設定によってブロックされたアプリケーション」の解除方法 http://www.geocities.co.jp/Playtown-Yoyo/6130/notes/virus-java-security.htm 例外サイト・リストに このサイトのトップ・アドレスの「http://artemis.rosx.net/」を設定して下さい。
- amanojaku1
- ベストアンサー率54% (265/488)
簡単にざっくりと説明すると figure(図形)と言う抽象クラスにdraw(描画)と言う抽象メソッドを作ったとして figure(図形)を継承したline(線)と言うクラスに(本当にデータを描画可能な)drawと言うメソッドを作り figure(図形)を継承したarc(円弧)と言うクラスに(本当にデータを描画可能な)drawと言うメソッドを作り figure(図形)を継承したspline(自由曲線)と言うクラスに(本当にデータを描画可能な)drawと言うメソッドを作り それら「line(線)、arc(円弧)、spline(自由曲線)」のインスタンス(実態)は、figure(図形)の配列に代入可能です、そのfigure(図形)配列をループで1つ1つ最後までdraw(描画)を実行させれば、figure(図形)配列を全て表示できます。 このメリットはfigure(図形)配列の中に どんなインスタンス(実態)が代入されているか考える必要がなく、処理の単純化によりバグ発生率を低下させる事が可能です。 ただし、処理の共通化を可能にするメソッドを自分で考える必要があります、また どうしても処理の共通化ができない場合も有得ます(初心者の場合、初めから諦めずに処理の共通化が出来ると言う前提で設計した方が良いでしょう)。 下記は上記を実際のプログラムで描画した画像です。 下記は描画エンジンだけをJavaに移植したものなので、新たなデータを作成できません。 古いJavaでコンパイルしているせいか?、アプレットとして実行できません。
- anmochi
- ベストアンサー率65% (1332/2045)
プログラムは書けんけど、例えばAをInputStream、BをSocketInputStream、CをFileInputStreamとしましょう。そうすると Socket s = ...; InputStream[] array = { s.getInputStream(), new FileInputStream("/usr/local/src/a.c") }; Aは基本クラスあるいはインターフェース、BとCはAから派生したクラスあるいはインターフェースを実装したクラスになるのは分かると思いますが、配列にする理由はおそらく反復処理をさせたいからでしょう。 for(int i = 0; i < array.length(); i++) { InputStream is = array[i]; while(is.available() > 0) { int readeddata = is.read(); } } 基本クラスAの抽象メソッド(BとCでオーバーライドできるなら別に普通のメソッドでも良い)に対してBとCでそれぞれ別の動きをつけ、配列に対して反復でそれらのメソッド(上のサンプルプログラムではavairable()とread())を呼び出すという使い道があります。 具体的にどのような場面で反復が役に立つかと言うと・・・・。 プラグインを扱う事ができるプログラム(例えばお絵かきソフトをJavaで作ったとすると、フィルターやブラシ、エフェクトなどをプラグインで機能追加できるようにしたいですね)ではメインプログラム起動時にプラグインディレクトリ中のJarファイルを一つ一つ見ていって、例えば先ほどのお絵かきソフトであればフィルタープラグインの基底クラスとして用意したAbstractFilterPluginクラスから派生したクラスが見つかればそれをインスタンス化してArrayList<AbstractFilterPlugin>の中に入れておくと便利そうです。 そしてAbstractFilterPluginクラスには抽象メソッドとしてプラグインの名前を返すgetName()、画像にフィルターをかけるexecuteFilter(Bitmap bitmap, int x, int y, int w, int h)を用意する事でしょう。 リストに入れたインスタンスたちを反復してgetName()で名前を取得するとフィルターのメニューを作る事ができそうです。