
お世話になります、
Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。
私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。
(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。
(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?
とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。
No.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つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。
まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。
とてもわかりやすくて、講義を聴いているようでした。
implementできるクラスはインターフェースだけと言うことでしょうか?
まだまだ勉強不足です。
No.2
- 回答日時:
#1のsueokaです。
自分で読んでいても「分かり難いなあ」とか思ってしまったので、補足です。(笑
1)のインターフェースですが、これは「共通規格」の様な物です。
例えば「USB」と言う規格(?)がありますが、「USB対応」と言う機器なら
どのメーカーのでもUSBコネクタに繋げる事が出来ますよね。
でも、実際にやり取りするデータの中身はどれもこれも違います。
が、「USBポートを通してデータのやり取りをする」と言う表面上の
処理名は同じです。その処理方法(データの内容など)が異なっていたりするわけです。
このインターフェースは個人で小規模のアプリケーションを作成する分には
考える必要はないと思います。使って直ぐに利便性が得られるものではないと
思います。良い具体例が思い浮かばないのですが・・・ActionPerformedって
ありますよね。ボタンクリックした時などにどんな処理をおこなうかを記述する
部分ですが、何もこのメソッドはボタンだけに在るわけでは在りませんよね。
色々なコンポーネントがこのインターフェースを実装していて、「ユーザーが
そのコンポーネントに対してアクションを起こした」と言う共通の動作によって
呼び出されるメソッドです。そして、VM内部で何かしらのアクションをキャッチした時に
それが何かを調べる必要が在るわけですが、もしもインターフェースが無い場合には、
ボタンであるか、コンボボックスであるか、チェックボックスであるかと一つ一つ
場合分けをしなくてはいけなくなります。後々、コンポーネントの追加をしようと思ったら
これは大変ですね。でも、ActionListenerインターフェースを実装していれば、
何のコンポーネントだろうとActionPerformedを呼び出せば良いのです。
凄い長くなってしまいましたが、「実装元を気にせずに使える関数」
を宣言する時にインターフェースを使うのではないでしょうか。
2)のextendは親クラスに新しく機能を追加する時に使いますよね。
3)のimplementはインターフェースを実装する時に使います。
長ったらしい補足ですみませんでした。
なるほど、勉強になります。
ActionPerformedとかはJBUILDERとかを使用しているのでコンポネントのダブルクリックとかで簡単にやってたんですけど。意味わかってなかったかも知れないです。
ありがとうございました。
No.1
- 回答日時:
いまいち自信が在りませんが・・・
1)はメソッドの名前と変数だけを提供するクラスを作成する時に
使用するものだと思います。
例えば、「FileAccess」のインターフェースクラスを作成して、
メソッドとして「FileRead」と「FileWrite」を用意したとしましょう。
すると、このインターフェースを実装しているクラスなら、どれでも
この二つのメソッドを持っている事になるので、そのクラスに対して
気兼ねなく(?)メソッドの呼出しが出来ます。
FileAccessインターフェースを実装しているクラスであればどれでも、
ファイルの読み書きを提供していると言う事になるわけです。
インターフェースは多くのクラスで共通の関数名を使えるようにするものだ
と、僕は思っています。(処理の内容自体はクラスによって異なりますが。)
2)の「extend」は親クラスを継承して新しく子クラスを作成する時に
使用します。文字入力域の子クラスを作成して半角文字しか入力できない
オリジナルの入力域クラスを作成する時などに使います。
3)の「implement」はインターフェースを実装する時に使うものだと
思っています。例えば、2)で作成したオリジナル入力域に対して
「FileAccess」インターフェースを実装すると、
ファイルの読み書き機能を搭載した半角文字しか入力できないオリジナルの
入力域を作成する事が出来ます。
以上でどうでしょうか?かなり大まかな説明ですが。
意味不明な部分が在りましたら、補足します。
ありがとうございました。
ちなみに、JTextFieldを継承した新しい機能を持ったTextFieldを作成するにはどうすればいいのかなあ…
って感じで今悩んでます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 15:14
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- 英語 Before we explain what leverage is, and how it wor 2 2022/04/10 16:20
- FTTH・光回線 グローバルIPアドレスの変更について 1 2022/04/23 05:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
WinInet Classを用いてSSL接続方法
-
APIリファレンスはどこにありま...
-
publicフィールドの使いどき
-
スーパークラスとサブクラスに...
-
[C@3331394などの文字列
-
携帯IApplicationのsuper
-
外部のクラスからコンテナをイ...
-
抽象クラスが継承されているか...
-
c# この高速化の方法あり? 2
-
クラスの直列化に関して
-
JAVAでゲームを作ろうとしてい...
-
Java の画像作成
-
模範解答を・・・
-
Integer.byteValue
-
VC++ ATLコントロールのインス...
-
スクロールバーについて
-
javaのASPを読んでも意味がわか...
-
抽象クラスをJUNITでテストする...
-
シンボルの解釈処理エラー
-
C# 「データが失なわれる可能性...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# 「データが失なわれる可能性...
-
「継承されたメソッドの可視性...
-
(vba)他のアプリケーションの右...
-
【C#】クラスのコンストラクタ...
-
VB DLLプロジェクトについて
-
メソッドの引数にクラス名を渡す
-
「ラッパークラス」の存在意義...
-
interface,extend,implementの...
-
c++でのヘッダーファイルの循環...
-
このエラーメッセージの意味を...
-
委譲って何ですか?
-
ゲッターを使わないで変数にア...
-
Javaのインスタンス化の構文の...
-
ファイルパスが取得出来ない(P...
-
ASP.NETでの共通コードの書き方...
-
Commons-Discovery.jarとは?
-
デバッグ時に「Source not found」
-
JTextFieldの入力制限
-
JavaのimplementsをC言語で例え...
-
オーバーライドとラッパーの違い
おすすめ情報