お世話になります、
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
高校生はアルバイトするべきだろうか?賛成だったら「賛」、否定だったら「否」を文頭においてあなたの意見を教えてください。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
passwordが入れられません・・・・
PostgreSQL
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel vbaのプログラムでガンマ...
-
javaの「型」がよくわかりません。
-
(vba)他のアプリケーションの右...
-
setTextについて
-
メソッドの引数の意味について
-
C++ヘッダの肥大化
-
vb.net 自作プロパティの削除に...
-
インタフェース、クラスの継承...
-
JTextFieldの入力制限
-
interface,extend,implementの...
-
compareToにおける「自然順序付...
-
オーバーライドとラッパーの違い
-
private継承はどう使う?
-
オブジェクト指向の壁
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
UMLのクラス図はmain()も含むん...
-
Java初級 引数に適用できません
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ラッパークラス」の存在意義...
-
C# 「データが失なわれる可能性...
-
VB DLLプロジェクトについて
-
抽象クラスをJUNITでテストする...
-
「継承されたメソッドの可視性...
-
インターフェースとトレイトっ...
-
c++でのヘッダーファイルの循環...
-
JavaでのAPIの覚え方ってみさな...
-
(vba)他のアプリケーションの右...
-
ASP.NETでの共通コードの書き方...
-
なぜForm型にキャストするので...
-
vb.net 自作プロパティの削除に...
-
【C#】クラスのコンストラクタ...
-
委譲って何ですか?
-
interface,extend,implementの...
-
Javaのインスタンス化の構文の...
-
オーバーライドとラッパーの違い
-
Commons-Discovery.jarとは?
-
JTextFieldの入力制限
-
C#からDLLを呼びたいのですが・...
おすすめ情報