お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

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

A 回答 (3件)

バラバラに理解してもしょうがないッス。



まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。
    • good
    • 60
この回答へのお礼

とてもわかりやすくて、講義を聴いているようでした。
implementできるクラスはインターフェースだけと言うことでしょうか?

まだまだ勉強不足です。

お礼日時:2001/07/31 10:11

#1のsueokaです。


自分で読んでいても「分かり難いなあ」とか思ってしまったので、補足です。(笑

1)のインターフェースですが、これは「共通規格」の様な物です。
 例えば「USB」と言う規格(?)がありますが、「USB対応」と言う機器なら
 どのメーカーのでもUSBコネクタに繋げる事が出来ますよね。
 でも、実際にやり取りするデータの中身はどれもこれも違います。
 が、「USBポートを通してデータのやり取りをする」と言う表面上の
 処理名は同じです。その処理方法(データの内容など)が異なっていたりするわけです。
  このインターフェースは個人で小規模のアプリケーションを作成する分には
 考える必要はないと思います。使って直ぐに利便性が得られるものではないと
 思います。良い具体例が思い浮かばないのですが・・・ActionPerformedって
 ありますよね。ボタンクリックした時などにどんな処理をおこなうかを記述する
 部分ですが、何もこのメソッドはボタンだけに在るわけでは在りませんよね。
  色々なコンポーネントがこのインターフェースを実装していて、「ユーザーが
 そのコンポーネントに対してアクションを起こした」と言う共通の動作によって
 呼び出されるメソッドです。そして、VM内部で何かしらのアクションをキャッチした時に
 それが何かを調べる必要が在るわけですが、もしもインターフェースが無い場合には、
 ボタンであるか、コンボボックスであるか、チェックボックスであるかと一つ一つ
 場合分けをしなくてはいけなくなります。後々、コンポーネントの追加をしようと思ったら
 これは大変ですね。でも、ActionListenerインターフェースを実装していれば、
 何のコンポーネントだろうとActionPerformedを呼び出せば良いのです。
  凄い長くなってしまいましたが、「実装元を気にせずに使える関数」
 を宣言する時にインターフェースを使うのではないでしょうか。

2)のextendは親クラスに新しく機能を追加する時に使いますよね。

3)のimplementはインターフェースを実装する時に使います。

長ったらしい補足ですみませんでした。
    • good
    • 8
この回答へのお礼

なるほど、勉強になります。
ActionPerformedとかはJBUILDERとかを使用しているのでコンポネントのダブルクリックとかで簡単にやってたんですけど。意味わかってなかったかも知れないです。

ありがとうございました。

お礼日時:2001/07/30 13:10

いまいち自信が在りませんが・・・



1)はメソッドの名前と変数だけを提供するクラスを作成する時に
 使用するものだと思います。
 例えば、「FileAccess」のインターフェースクラスを作成して、
 メソッドとして「FileRead」と「FileWrite」を用意したとしましょう。
 すると、このインターフェースを実装しているクラスなら、どれでも
 この二つのメソッドを持っている事になるので、そのクラスに対して
 気兼ねなく(?)メソッドの呼出しが出来ます。
  FileAccessインターフェースを実装しているクラスであればどれでも、
 ファイルの読み書きを提供していると言う事になるわけです。
  インターフェースは多くのクラスで共通の関数名を使えるようにするものだ
 と、僕は思っています。(処理の内容自体はクラスによって異なりますが。)

2)の「extend」は親クラスを継承して新しく子クラスを作成する時に
 使用します。文字入力域の子クラスを作成して半角文字しか入力できない
 オリジナルの入力域クラスを作成する時などに使います。

3)の「implement」はインターフェースを実装する時に使うものだと
 思っています。例えば、2)で作成したオリジナル入力域に対して
 「FileAccess」インターフェースを実装すると、
 ファイルの読み書き機能を搭載した半角文字しか入力できないオリジナルの
 入力域を作成する事が出来ます。

以上でどうでしょうか?かなり大まかな説明ですが。
意味不明な部分が在りましたら、補足します。
    • good
    • 3
この回答へのお礼

ありがとうございました。
ちなみに、JTextFieldを継承した新しい機能を持ったTextFieldを作成するにはどうすればいいのかなあ…
って感じで今悩んでます。

お礼日時:2001/07/30 17:23

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

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

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

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

Qjava アップデート後の旧バージョン削除の件

javaのアップデートで質問です。javaのアップデートをインストールし行いました。インストール後、旧バージョンは削除したほうがよいとコメントがありました。パソコンのコントロールパネルを開き確認したところjava7update51(バージョン7.0.510)とjava7update60(バージョン7.0.600)があるのですがどちらを削除したらよいでしょうか?windous8でパソコンは初心者レベルです。宜しくお願いします。

※OKWaveより補足:「富士通FMV」についての質問です。

Aベストアンサー

Java7u51->7u55->7u60の順で新しくなりますから、
7u60以外は全て削除すれば良いです。

QEclipseで例えば↓のようなInterfaceをimplement

Eclipseで例えば↓のようなInterfaceをimplementsしているクラスの一覧を調べたいといったような時に一覧を出す方法はあるでしょうか?
(クラスだったら、コンストラクタで「呼び出し階層を開く」でいけるとおもうのですが)

public interface Interface{}

Aベストアンサー

 対象のインターフェイスを選択 → F4 (型階層を開く)
で、実装しているクラスの一覧が表示されるかと。

QJava等の自動アップデート画面を詐称されたら?

JREやAdobeのFlashPlayer、AdobeReaderなどは、自動アップデート機能がバックグラウンドで動いており、アップデートがあれば自動でウィンドウが立ち上がり、アップデートをユーザーに促してきます。

この際、UACがアップデートの許可を求めてきますが、もし仮に全然別のウィルスがそれらアップデートの画面と全く同じものを表示してきてユーザーに許可を促す、ということはありうるのでしょうか?
ありうる場合、「ウィルスの騙りではなく正真正銘Javaのアップデートである」判断する方法はあるのでしょうか?
今まで「Javaのアップデートなら」とそのままOKしていましたが、詐称されていたらどうなるんだろう、と恐くなりました。

アップデートの有無の判断だけやらせて、更新自体は手動でWebサイトからやれば安全そうですが、できれば
自動アップデートの告知⇒その画面からアップデートを開始する
という流れはそのままにしたいのですが。

Aベストアンサー

はい、これ

やったばっかの動作検証

新Kingsoft Internet Security 2013の一つの売りである外部からのWebCam操作防止機能は有効のようです。

起動元がJava Update Schedulerになってるのがわかるかな? 要はマルウェアによる他のプロセスへのなり済ましが行われています。

日頃、システム上でどんなプロセスが動いているかざっとでも把握してると違うんだよね。


http://www.dailymotion.com/video/xxkz7a_yyyyyremote-admin_tech#.USGpWme_M2s




話変わるけど、異変を察知できた人↓

http://www.nhk.or.jp/gendai/kiroku/detail02_3263_all.html


「CPU使用率が・・・・・・・・・」

Q静的メソッドとインスタンスメソッドを定義する方法

簡単な、カウンタクラスからのインスタンス作成とその利用のテストを行いました。

テストとして作成した以下の内容のファイルをブラウザ(IEやFireFox)で開くと、期待した結果は返りますが、(Windowsで処理待ちを示す)砂時計マークがいつまで経っても消えません。

どこかで永続ループでもしているのでしょうか。

どこに問題があるのか、また、こういった問題のデバッグのコツを教えて下さい。
よろしくお願いします。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<HTML>
<HEAD>
<TITLE>教えて!goo</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<META HTTP-EQUIV="Content-Script-Type" CONTENT="javascript">

<SCRIPT TYPE="text/javascript">
function Counter(initialCount) {
this.count = initialCount;
}

Counter.prototype = {
count : 0,
increment : function() {
this.count += 1;
},
decrement : function() {
this.count -= 1;
}
}

Counter.newInstance = function(initialCount) {
return new Counter(initialCount);
}

var counter;

function testCounter() {
counter = Counter.newInstance(100);
counter.increment();
document.write(counter.count);
}

</SCRIPT>

</HEAD>

<BODY ONLOAD="testCounter()">
</BODY>
</HTML>

簡単な、カウンタクラスからのインスタンス作成とその利用のテストを行いました。

テストとして作成した以下の内容のファイルをブラウザ(IEやFireFox)で開くと、期待した結果は返りますが、(Windowsで処理待ちを示す)砂時計マークがいつまで経っても消えません。

どこかで永続ループでもしているのでしょうか。

どこに問題があるのか、また、こういった問題のデバッグのコツを教えて下さい。
よろしくお願いします。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4...続きを読む

Aベストアンサー

writeで書き込んだ後はcloseしてください。

QJavaアップデートの更新の案内がきていますが?

Javaアップデートの準備が出来たと、更新の案内が来ているのですが、Javaなるものを使っているものやらわかりません。詳細文には「Java Update には、お使いのコンピュータで実行する Java アプリケーションのパフォーマンス、安定性、セキュリティーを改善するための重要な拡張機能が含まれています。この無料の更新をインストールすれば、お使いの Java アプリケーションを引き続き安全かつ効率的に活用できます。」ということで、自分のPCにインストールしているから更新の案内が(自動で)来るのだとは思うのですが。あまりメモリーの大きなPCでもないので、変なソフトは出来るだけ入れたくないのでどうしたものかと迷っています、教えてください。

Aベストアンサー

場所によってはホームページを閲覧するだけでもJavaを使うことがあります。
よほどの理由が無い限りは最新のアップデートは実施しましょう。

・Java Update
・Flash アップデート
・お使いのセキュリティソフトのアップデート

以上の3点はインターネットを使う上で重要なポイントなので必ず更新しましょう。
(もちろん必要無いとはっきりわかっているなら不要なものもありますが。)

Q[クラス名].[メソッド名].[メソッド名]という書き方。

javaを勉強している者です。

少しピンと来ない書き方があるのですがそれはタイトルの通りの書き方で、具体的には

Main.getMailStore().isNewMail()

という書き方です。MailというのがクラスでgetMailStore()というのがそのクラスで宣言されているメソッドで下記のように実装されています。(MailStoreというのはインターフェースとして別のファイルで宣言されています。)

private static MailStore _mailStore;

public static MailStore getMailStore(){
return _mailStore;
}

(MailStoreというインターフェースの中にisNewMailというメソッドは宣言されています。)

public interface MailStore{
public boolean isNewMail(String uid);
}

これらだと、最初のMain.getMailStore().isNewMail()というのは、
「まず、MainクラスのgetMailStoreメソッドを呼び出して、そこでreturnされてくるMailStore型のクラスの中の、isNewMailメソッドを呼び出している」というのを一回で書いてしまっている書き方ということで合っているでしょうか?少しピンと来ないので・・(特にreturnされるメソッド(getMailStore)にそのまま.[メソッド]という書き方をのっけるあたりが)

よろしくお願いします。

javaを勉強している者です。

少しピンと来ない書き方があるのですがそれはタイトルの通りの書き方で、具体的には

Main.getMailStore().isNewMail()

という書き方です。MailというのがクラスでgetMailStore()というのがそのクラスで宣言されているメソッドで下記のように実装されています。(MailStoreというのはインターフェースとして別のファイルで宣言されています。)

private static MailStore _mailStore;

public static MailStore getMailStore(){
return _mailStore;
}

(MailSt...続きを読む

Aベストアンサー

あってます。

QJAVAのアップデートは必要ですか?

OSはXP-HOME、IE6です。
PCを起動して、インターネットに接続したら
「Java(TM)Update」を促すポップが出たので、
内容もわからないままダウンロード&インストールしてしまいました。
そしたら、オンライントレードで利用している個別銘柄の株価時価表示の
画面がみれなくなってしまいました。
このトラブルは当該ネット証券に問い合わせて解決しました。
そこで質問なのですが、

1.このアップデートは必ず必要なのですか?必要だとしたら、その理由は?

2.今後また同様のJAVAのアップデートを勧めるポップが表示された時は、
上記のようなトラブル防ぐためには、どういう点に注意すべきなのでしょうか?

Aベストアンサー

あくまで主観だけど・・・・

>1.このアップデートは必ず必要なのですか?必要だとしたら、その理由は?

「必ず」とは言えない。

>2.今後また同様のJAVAのアップデートを勧めるポップが表示された時は、上記のようなトラブル防ぐためには、どういう点に注意すべきなのでしょうか?

changelog(更新履歴)を見て、旧バージョンと比較して「どこが変更されたのか」を把握しておく。できることなら影響しそうな場所のヘルプやフォーラムのコメントを読んでみる

Qコンストラクタ,interface,abstractの呼び出し順について

現在、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
が追加されると理解していたのですが、結果は、
違っておりました。

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

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

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

public interface interFaceClassS {
   public void show();
}

// 抽象クラス
public abstract class ClassSSSab {
   // 共通のメソッドを実装
   //個々のメソ...続きを読む

Aベストアンサー

interFaceClassSを実装

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

これで説明付くんじゃないかしら。

Qjavaのアップデートをしようとしたら、次のようなメッセージが出て出来

javaのアップデートをしようとしたら、次のようなメッセージが出て出来ませんでした。

『システムの現在のインターネット接続ではjava updateを続行できません。
 windowsの「コントロールパネル」で「インターネットオプション」→「接続」を選択して
 LANの設定とプロキシ情報が正しいことを確認して下さい』

上記の画面を開いてみましたが、何がどういう状態であれば正しいのか分かりません。
どなたか教えていただけないでしょうか?

よろしくお願いします。

Aベストアンサー

直接の回答ではないですけど、Javaのアップデートが目的なら。

インターネットでサイトの閲覧とかはできる環境ですか?
JavaのアップデートはSun Microsystemsのサイトに
アクセス出来るのならオフライン インストール用のパッケージを
ダウンロードしてインストールすればよろしいかと思います。
(他機でダウンロードしてUSBメモリとかで持ってきても可)
http://java.com/ja/download/

Qinterfaceを実装するとは?

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

abstractはクラスの継承で

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

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

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

Aベストアンサー

>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()メソッドを持っています(いなければならない)。
インターフェース、抽象クラスなどの考え方は一度、分かっている
人に徹底的に教えてもらったほうが良いでしょう。文章だと、理解
するのが、結構大変です。(説明する方も難しい)


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

人気Q&Aランキング