interfaceを実装するとはどういうことですか?

abstractはクラスの継承で

学校 -abstract(拡張)― 教室 ―abstract(拡張)― 生徒

と機能を細分化するものとわかりました。

インターフェースってなんですか・・

A 回答 (3件)

>AppletContextインターフェースにあるgetAudioClipメソッドを使うにはどうすればいいですか


例えば、AppletクラスのgetAppletContextメソッドで取得できます。
class myClass extends Applet {
  public void aaa() {
    AppletContext x = getAppletContext();
    URL u = new URL("~");
    AudioClip c = x.getAudioClip(u);

変数xにはあるクラスのインスタンスが代入されます。このクラスの
名前はAppletContextではありませんが、AppletContextを実装する
ので、getAudioClip()メソッドを持っています(いなければならない)。
インターフェース、抽象クラスなどの考え方は一度、分かっている
人に徹底的に教えてもらったほうが良いでしょう。文章だと、理解
するのが、結構大変です。(説明する方も難しい)
    • good
    • 0
この回答へのお礼

ありがとうございます。

独学なので、教えてくれる人がいないんです。
1冊の本を読んでも理解できないので、いろいろな本を読んで少しずつ理解していってる状態です。

回答を教えていただきありがとうございます。

URL u = new URL("~");
AudioClip c = x.getAudioClip(u);

引数はインスタンスしてないとダメなんでしょうか・・

インスタンス.メソッドの引数がインスタンス・・・理解できません・・・

想像以上にむずかしいです。
簡単なソフトを作るレベルでも相当だと感じます。
自分が頭が悪すぎるんでしょうか。。。あまりに理解できなさすぎて萎えます。。

お礼日時:2009/05/16 15:14

abstract は抽象クラスや抽象メソッドに付ける修飾語で、「継承」


ではありません。抽象クラスもインターフェースも似たような使い
方ををしますが、「実装」する場合、抽象クラスはextendsしますが、
インターフェースはimplementsします。
例えば、「学校」というインターフェースには「教室」、「生徒」
というメソッドがあるとします。
現実の学校、例えば、私立○○中学高等学校が「学校」という
インターフェースを持つためには必ず「教室」、「生徒」という
メソッドを持つ必要があります。これらのメソッドは何らかの
具体的な処置が記述されます。この「具体的な処理を記述する」が
「実装」にあたります。
一方、抽象クラスは規定の処理を記述できるので、特に変更する
必要が無ければ、継承したクラスではメソッドを持たなくてもよい
のです。但し、継承なので複数のクラスを継承できません。
これに対し、インターフェースは複数指定が可能です。
例えば、「私立」というインターフェースがあり、「理事長」という
メソッドがあるとすると、私立○○中学高等学校は「学校」と、「私立」
という二つのインターフェースを実装することができます。
区立第1中学は公立なので、理事長がいないため、「学校」という
インターフェースしか実装できない、といった具合です。

あるメソッドが「学校」というインターフェースをパラメータに
する時、これを実装する私立○○中学高等学校も区立第1中学も
パラメータに指定することができます。

類似したクラスが多数作られ、共通処理が幾つも予想される場合、
共通項目を集めてインターフェース、あるいは抽象クラスとする
のが普通です。どちらを使うかは「状況による」としか言えません。

この回答への補足

間違えていました。多分、こういうこと???

学校抽象クラス―公立インターフェイス―理事長クラス
                   ↑
                   |教室・教師・生徒インターフェイス―教室・教師・生徒クラス
                   ↓
       └私立インターフェイス―校長クラス
                   

補足日時:2009/05/15 19:14
    • good
    • 0
この回答へのお礼

ありがとうございます。

たとえば、Java Platform Standard Ed.6にあるjava.appletパッケージを使うとします。
そこにはAppletContextインターフェースとgetAudioClipクラスがあります。

AppletContextインターフェースにあるgetAudioClipメソッドを使うにはどうすればいいですか?

AudioClip getAudioClip(URL url)
パラメータ:url-オーディオクリップの位置を示す絶対URL
戻り値:指定されたURLにあるオーディオクリップ

ライブラリ一覧の説明を見ても使い方がわからないので途方にくれています。

―――――――――――――――――――――――――――――――――――――

インターフェイスだけだと機能しないので、なんらかのメソッドを記載することをインターフェイスを実装するという。

インターフェイスは何らかのメソッドを持つ必要がある。
インターフェイスは複数継承することができる。

A←C 親が複数=インターフェイス(inplement)
B←┘

A←B 親は1つ=抽象クラス(abstract)
↑ C
└-┘

抽象クラスはメソッドを書かなくても、抽象クラス自身が持つことができる。

AppletContextインターフェース ― getAudioClipメソッド

学校インターフェイス―公立抽象クラス―理事長・教室・教師・生徒メソッド
          └私立抽象クラス―校長・教室・教師・生徒メソッド

実装するとなるとこんな感じですか????

お礼日時:2009/05/15 19:02

その「-abstract(拡張)―」が何を意味するのかは知らないけど, なんとなく激しく勘違いしてる気もする. 「機能を細分化する

」ってのは的を外してるような....

この回答への補足

#2の補足です。
#1の補足に失敗しました。これが正解です。

学校抽象クラス―公立抽象クラス―理事長クラス
                   ↑
                   |教室・教師・生徒インターフェイス―教室・教師・生徒クラス
                   ↓
         └私立抽象クラス―校長クラス

実装するにはこうなりますか?

補足日時:2009/05/15 19:17
    • good
    • 0
この回答へのお礼

ありがとうございます。

1つのクラスで書いてもいいですが、機能をわかりやすくするのに抽象クラスを使うのかと思いました。

たとえば、
学校抽象クラス-学年抽象クラス-生徒抽象クラス-個人情報クラス
                      -成績クラス
                      -出席率クラス

わかりやすいクラスにするためのものが、
インターフェイス(implement)・抽象クラス(abstract)かと思っています。
的はずれですか????

お礼日時:2009/05/15 19:09

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

このQ&Aを見た人はこんなQ&Aも見ています

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

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

Qシンボルが見つかりませんというエラーが理解できません。

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Image[3];
Thread t;
int index1 = 0;
int index2 = 0;
String msg = "";
String msg1 = "";

boolean state = false;
Button b1 = new Button("ぐー");
Button b2 = new Button("ちょき");
Button b3 = new Button("ぱー");

public void init(){
for(int i = 0; i<=2; i++){
img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG");
}
add(b1);
add(b2);
add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
msg1 = "結果は・・";

}

public void paint(Graphics g){
g.drawImage(img[index1],350,30,this);
g.drawImage(img[index2],695,30,this);
g.drawString("コンピューター",420,300);
g.drawString("あなた",800,300);
g.drawString(msg,630,320);
g.drawString(msg1,550,320);
}

public void start(){
state = true;
t = new Thread(this);
t.start();

}

public void run(){
while(state){
index1++;
if(index1 == 3){
index1 = 0;
}
index2++;
if(index2 == 3){
index2 = 0;
}
repaint();
try {
Thread.sleep(60);
}catch(InterruptedException e) { }
}
}

public void actionPerformed(ActionEvent e){
if(state == false) {
start();
return;

}
state = false;
if(e.getSource() == b1) {
msg = "ぐー";
index2 = 0;
}

else if(e.getSource() == b2){
msg = "ちょき";
index2 = 1;
}

else if(e.getSource() == b3){
msg = "ぱー";
index2 = 2;
}
check();
repaint();
}

public void check() {
if(index1 == index2) msg ="あいこ";


else if (index1 == 0) {
if(index2 == 2) msg="あなたの勝ち";
else msg ="あなたの負け";
}

else if(index1 == 1) {
if(index2 == 0) msg="あなたの勝ち";
else msg="あなたの負け";
}

else if(index1 == 2) {
if(index2 == 1) msg="あなたの勝ち";
else msg="あなたの負け";
}

}
}

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Imag...続きを読む

Aベストアンサー

「シンボルを見つけられません。」というエラーの下に何か表示がありませんでしたか?そこにヒントがあると考えられます。
シンボルを見つけられませんといエラーが表示される主な理由は4つあります。
(1)クラス、メソッド、変数などの綴りミスや定義していない変数を使用している可能性がある。
(2)コンストラクタを呼び出すときに、newを忘れている可能性がある。(3)公開されていないメンバーを呼び出している可能性がある。
(4)必要なimport文を記述し忘れている可能性がある。
ここでのあなたのエラーは(1)番ではないでしょうか?上記ではimageとなっている変数がimgになっていますね。
これはエラー表示をよく見ることで意外と簡単に解決できるのです。
ゆっくり丁寧にエラー表示を見るように心がけることが大事ですよ。

QJavaでの改行コード

Javaでファイル出力をしたいのですが、
改行コードを「\n」にしたところ「・」が入ってしまいました。
「・」が入らないような改行コード、あるいは
なにか良い対策案を教えて下さい。

Aベストアンサー

すいません。自己補足です。(^^ゞ

System.getProperty("line.separator");

パラメータが違ってました。先のものだとファイルの区切り文字がとれちゃいますね。(^^ゞ

やり方は色々あるのでみなさんのアドバイスを参考に一番やりやすい方法を捜して下さい。

Qi++と++i ってどう違うのですか?

i++と++i ってどう違うのですか?

C#です。

Aベストアンサー

++や--を変数の前に置く演算を「前置演算」、++や--を変数の後に置く演算を「後置演算」といい、その違いは、次のようになります。

前置演算:先に処理(++や--)をしてから代入
(例)i=2;
   a=++i;
    ~~~
    先に処理 : iは3
   ~~~~~
   後から代入 : aは3

後置演算:先に代入してから処理(++や--)
(例)i=2;
   a=i++;
   ~~~
   先に処理   : aは2
    ~~~~~
    後から代入 : iは3

Qpublic static void main (String args[])

基本すぎて申し訳ありませんが、
public static void main (String args[])とはどういう意味を持っていますか?
教えてください。。

Aベストアンサー

staticとかの意味はNo1の方の説明以外にありません。

mainは最初に実行されるメソッドという説明がされますので、「クラスを実行する時の引数とは?」と引っかかっているのかもしれませんね。
これはコマンドライン引数と呼ばれます。

たとえば、次のプログラム

public class ArgsTest{
  public static void main(String[] args){
    System.out.println(args.length);
    for(int i = 0 ; i < args.length ; i++){
      System.out.println(args[i]);
    }
  }
}

これを
>java ArgsTest abcde fghij(エンター)
として実行するとabcdeとfghijが引数となります。

ちなみに、mainはpublicでstaticなメソッドなので、
public class ArgsTest2{
  public static void main(String args[]){
    tamesi();
  }
  void tamesi(){
    String[] test = {"abcde","fghij"};
    ArgsTest.main(test);
  }
}
のように、外部のクラスからクラス名.mainで呼び出せます。(この2つのプログラムは、私が悩んだ時に試しにつくったものです)

ちなみにargsはarguments(=引数)の略で、mainの引数として、よく使われます。
argvのほうはargument valueの略です。C言語を使っていた人の中にはargvを使う人がいるかもしれません。

staticとかの意味はNo1の方の説明以外にありません。

mainは最初に実行されるメソッドという説明がされますので、「クラスを実行する時の引数とは?」と引っかかっているのかもしれませんね。
これはコマンドライン引数と呼ばれます。

たとえば、次のプログラム

public class ArgsTest{
  public static void main(String[] args){
    System.out.println(args.length);
    for(int i = 0 ; i < args.length ; i++){
      System.out.println(args[i]);
    }
  }
}

...続きを読む

Q*をユーザーが入力した数字の数だけ表示するプログラムの作り方を教えてください

はじめまして。
現在C言語の勉強している大学生です。

『*』をユーザーが入力した数字の数だけ表示するプログラムの作り方を教えてください。
例えばユーザーが5と入力したら*****とでるもの。

(本に載っている演習なのですが答えがのっていないのです。)
whileかforを使うのだと思うんですが。。
よろしくお願い致します。

Aベストアンサー

これで、OKです。
とても簡単なプログラムです。

#include<stdio.h>
int main(void)
{
int i,num;
printf("何個表示しますか?->");scanf("%d",&num);

for(i=0;i<num;i++)
{
printf("*");
}
printf("\n");

return 0;
}

Qfloat型とdouble型の変数の違いを教えてほしいです

float型とdouble型の変数の違いを教えてほしいです
2Dゲームを作っててdoubleの変数を使ってたんですが使ってはだめだと先輩に言われたんです。
理由を聞いたら、先生が「doubleは使わないほうがいい」と言われたらしくてちゃんとした理由がわかりませんでした。
それを知って何をするということではないんですが、気になって調べても出てこなかったので質問させてください。
まだゲーム作りを始めたばっかりでぜんぜん詳しくないですが教えてくれたら助かります。

Aベストアンサー

doubleとfloatでは、精度が違い、そのためメモリに占める大きさも違います。
また、一般的には、桁が多いとその分計算時間がかかります。
ですから、精度が必要ない場面では、floatを使う、というのも一つの考えかたです。

ですが、実際には「一概に言えない、処理系依存」です。

以前は全てCPUで計算していたので、精度=計算量でした。
しかし、最近では浮動小数点演算専用の回路が付いているケースが多く、計算時間は同じだったり、doubleに変換が必要でその分floatの方が遅かったり、floatでの演算はより高速にできたり、と様々です。
32bitCPUでは、32bitのfloatの方が扱いやすいでしょうが、64bitCPUでは64bitのdoubleの方が扱いやすいかもしれません。
Cのmath.hで使える標準関数はdouble型のものがほとんどです。三角関数は2Dのゲームでも使う機会が多いのではないでしょうか。sinもcosもdouble型です。内部演算は当然doubleですので、変数にfloatを使ったからと早くはならず、むしろfloat型の変数に入れるときに暗黙の型変換が発生する分遅くなる可能性もあります。

そういった背景を考え検討した結果、floatを使う方がよい、と判断したのならいいのですが、「先生に言われた」では理由になりません。
聞けるのなら、その先生に理由を聞いてください。真意がわからないうちは、鵜呑みしないことです。

doubleとfloatでは、精度が違い、そのためメモリに占める大きさも違います。
また、一般的には、桁が多いとその分計算時間がかかります。
ですから、精度が必要ない場面では、floatを使う、というのも一つの考えかたです。

ですが、実際には「一概に言えない、処理系依存」です。

以前は全てCPUで計算していたので、精度=計算量でした。
しかし、最近では浮動小数点演算専用の回路が付いているケースが多く、計算時間は同じだったり、doubleに変換が必要でその分floatの方が遅かったり、floatでの演算はより高速...続きを読む

Q「ラッパークラス」の存在意義が分かりません。

「ラッパークラス」の存在意義が分かりません。

ラッパークラスの使い方などについての解説はよく目にしますが、
その意義となると、明確な説明を見たことがありません。
(本質問では、使い方を質問しているわけではありません。)

どういう意味で、便利なのか、
つまり、その存在価値について、お聞きしたいのです。

これがないと乗り越えられない壁があるのでしょうか。
その壁を乗り越えるための道具として、用意されたものであるなら、
その壁というものを教えて頂きたいです。

どなたか宜しくお願い致します。

Aベストアンサー

個人的に納得している状況を話しますね。
プリミティブなデータ(例えばint)はそれ自体に実体が
あるから、「インスタンス化」なんてしませんよね。
ということは「null」には絶対にならないわけです。
ところで、データベースからレコードを読み込み、整数型の
フィールドのデータを受け取ることを想定します。
そのフィールドがnullだった場合、受け取る変数がint型で
あったら、「nullであること」を表現できません。nullと
0は違いますからね。でも、Integer型の変数ならnullにする
ことができます。それにtoStringで編集したりできるのも
ウレシイところです。
あと、リフレクションをやると分かりますけど、実行させる
メソッドに渡す変数は本体の定義がプリミティブ型でも、
オブジェクト型の配列にする必要があるので、ラッパークラスに
限られます。

QJava-jspの画面入力値保持について

画面にテキスト、ラジオボタン、リストボックス とボタンがあります。
ボタンを押すと、JAVAで処理を行い、jspのviewで表示します。

1.テキスト、ラジオボタン、リストボックスなどに値が入力、設定されている状態で
ボタンを押して処理後にテキスト、ラジオボタン、リストボックスの値が
変わらないようにしたいのですが、
その場合、たとえば、入力、設定値をセッションになどに格納しておき
jspの所で、セッションから値を設定すると言うような方法になるのでしょうか?

2.ボタン押して処理後、ラジオボタン、リストボックスの選択値も
  変えないようにしたいのですが、
  これはどのように実現するのが、適切なのでしょうか?


以上、よろしくお願いします。

Aベストアンサー

ボタンというのはフォームのサブミットボタンのことですよ?
つまり、画面遷移が起きることを前提とすると(元の同じ画面に戻るのも含みます)

テキスト、ラジオボタン、リストボックスの状態を「要求パラメータ」として
送信し、それを次画面に反映するというのが最も一般的な方法です。

フレームワーク struts のアクションフォーム&JSPカスタムタグを使うと比較的楽に
そういう画面が作れますが、多くのフレームワークでも大差ありません。
簡単な画面なら素のサーブレート+JSPでも十分作れます。

セッションでもできますが、 セッションはログイン情報などの保持など、
限定された範囲で使うのが普通です。また、結局セッションに最新の
テキスト、ラジオボタン、リストボックスの状態を送るには、「要求パラメータ」
を送信する必要があります。

AJAXを使うという方法もあります。この場合、ボタンは AJAX 処理だけを行い
画面遷移を起こさないので、サーバ側で画面のテキスト、ラジオボタン、
リストボックスの状態をもつ必要はありません。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報