質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

6回答

11945閲覧

インターフェースってわかりやすい例に例えると?

mr0237

総合スコア164

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

1グッド

2クリップ

投稿2017/01/08 15:27

JAVAを勉強している者です。説明が下手ですいませんが、「インターフェース」って一体なんなんでしょうか?
ネットや参考書みても「特に抽象度(派生させて目的に応じた機能を実装させることを前提として設計した)が高い抽象クラス」と書いてあるんですが、なんなのかよくわかりません。

私はまだ勉強不足だと思いますが、インターフェースっていうのは、「何かと何かを繋ぐ」という意味でしょうが、「特に抽象度が高い抽象クラス」と、「何かと何かを繋ぐ」というのは何か関係あるのですか?

わかりやすいような例や例えで教えてくれませんか?
できれば身近な例を挙げて教えてくれませんか?
よろしくお願いします。

mit0223👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

ベストアンサー

以前どこかで見たたとえで分かりやすいものとしてはUSBポートでしょうか。
USBポートにつなぐものは様々な種類のデバイスがあります。
マウス、キーボード、外付けHDDなど、機能も役割もバラバラです。
しかし、USBという統一されたインタフェースのおかげで、みんな基本的に差し込むことで使うことができます。
抽象度を上げる、つまり実体を気にしなくて済むようにすることで、みんな統一して使うことができるのです。

投稿2017/01/08 15:36

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

抽象クラスについても質問されておられましたが、インタフェースもこれと同じ目的のものです。インタフェースも直接インスタンスを作ることができません。インタフェースを引き継いだクラスを作る際は、「継承」ではなく「実装」という言葉を使います。

javaにおいては多クラスの継承は禁止されています。一方で多インタフェースの実装は可能です。

ちなみに、どうやらオブジェクト指向について勉強されておるようですが、これは実践的なプログラミングをしないことには利益がわかりづらいものだと思いますよ。「意図的な機能制限」についての有用性はデバッグとかを通じたほうがわかりやすいです。

投稿2017/01/08 23:26

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Javaのインターフェイスは、Javaでは一つしか親クラスを持てないために、親クラスにしか、成り済ます(=ポリモーフィズム)ことが出来ないという問題を避けるための仮のクラスです。(実際には無いクラスなので、抽象的だとかそういう言葉が使われます。)

継承関係が直接ない2つのクラスが、同じ引数を持つ同じ名前のメソッドを持つことを保証することで、どちらのクラスもインターフェイスクラスに成り済ます(=ポリモーフィズム)ことができます。(本質的には、意味上の振る舞いも同じでないと困るのですが、現時点では理解するのは難しいと思います。)

厳密にどういった意味合いでインターフェイスと名付けられたか解りませんが、私はインターフェイスクラスで定義したクラスの仕様に他のクラスが合わせて繋げることができる点がインターフェイスという言葉にしっくり来ます。

実際のところは、サンプルコードを見て理解した方がわかりやすいと思います。
(サンプルコード読んだけどよくわからないという質問の方が説明し易いです。)

投稿2017/01/08 18:43

iwamoto_takaaki

総合スコア2883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Javaにおけるインターフェイスは、特定の動作を行うために、メソッドの書き方を定義するものです。

例えばJavaからデータベースを利用したいとき、
「もしJavaからSQLクエリを発行したいのなら、こんなメソッドを用意しておいてね」
という決まりを決めておけば、利用するDBがなんであれ、同じ名前のメソッドに同じように値を入れれば、あとはそれぞれのDBに対応したインターフェイスがDBを操作してくれます。

身近な例でいえば、GUIとかでしょうか。
Graphical User Interfaceは、プログラムを視覚的に利用できるようにするための、ユーザとプログラムの間にある面、です。
GUIは、「ボタンとかを用意して、クリックすればプログラムの機能を利用できるようにしたもの」ですよね。
コマンドとか知らなくても、マウスでべちべちとアイコンやボタンをクリックしていけばプログラムを利用できます。

つまり、Javaに限った話なら、
特定の動作を行うメソッドの作り方を決めておくことで、その面(インターフェイス)の向こう側を気にしなくてもいい(こっち側だけ変えればいい)ようにするもの
IT用語としては、
利用者がその中身を気にしなくても利用できるようにするための面

ということになるかと思います。

もしよかったら、以下も読んでみてください(検索してすぐに出てくるものですが)。
http://www.gixo.jp/blog/5159


ちなみに英単語としてのInterfaceの語源は、

  • Inter: 間、Face: 面

よって、Interface=間の面、つまり何かと何かの間を取り持つ面、になります。

僕もはじめ「何かと何かをつなぐ」という認識でしたが、「~ために間にある面」という認識のほうがいい気がしてきました。

どうでもいいですけど、この単語ほどカナ表記が不定な単語ってないですよね…
インターフェースとかインタフェースとかインターフェイスとか。。。
Internetはインターネット、Facebookはフェイスブックなので、僕はインターフェイスと書きますが。

投稿2017/01/11 07:15

編集2017/01/11 07:17
GrassfieldK

総合スコア50

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

デザインパターンをやってみてください。

時に Factory系 ( FactoryMethodパターン, Factoryパターン, AbstractFactoryパターン )。

インターフェースは、指定されたメソッドがあることを保障するものです。

( 私は C/C++ でやっていて、Javaはあまりやっていないので書き方が微妙ですが... )

たとえば、

Java

1public interface Keisan{ 2 double calc( double a, double b ); 3}

とあったら、このKeisanインターフェースを継承しているクラスは calcメソッドを定義する必要があります。
言い換えれば、このKeisanインターフェースを継承している子クラスは calcメソッドは必ずある。
ということです。

これを実装して、足し算クラス, 引き算クラス, 掛け算クラス を生成してみましょうか。

Java

1public class Tashizan implements Keisan{ 2 public double calc( double a, double b ){ return a + b; } 3} 4 5 6public class Hikizan implements Keisan{ 7 public double calc( double a, double b ){ return a - b; } 8} 9 10 11public class Kakezan implements Keisan{ 12 public double calc( double a, double b ){ return a * b; } 13} 14

ここまでだと理解しづらいですが、ここからです。

じゃあ、簡易的な計算プログラムをつくってみましょうか。

mainメソッド等は省きます。( 例なので。 )

ユーザ入力の値によって行う計算を変えるします。

1 : 足し算, 2 : 引き算, 3 : 掛け算

とします。

ですが、ここで問題があります。

ユーザが入力されるまでどのクラスを生成するのかわかりませんね。
ですが、 Java の場合、型を定義しないといけません。
JavaScript みたいに

JavaScript

1var v; 2v = 100; 3v = "文字列";

のようになんでも入れられるっていうわけではないのです。

では どうするか。

インターフェース型としておきましょう。

インターフェースで ( new で ) インスタンス化することは不可能ですが。
型とするならOKなのです。

すると、

Java

1// mainメソッド内として。 2Keisan keisan; 3int cmd; 4double ans; 5 6// ここでユーザ入力を受け付ける ( int cmd に格納。 ) 7 8if( cmd == 1 ){ 9 keisan = new Tashizan(); 10}else if( cmd == 2 ){ 11 keisan = new Hikizan(); 12}else if( cmd == 3 ){ 13 keisan = new Kakezan(); 14} 15 16ans = keisan.calc( 20, 3 ); 17 18System.out.println( ans );

という風にできます。

で? と思いますよね?

よーく見てください。

ans = keisan.calc( 20, 3 );

とありますね。

インターフェース型として受け取っているので、インターフェースで指定されているcalcメソッドが保障されているので 使うことができるのです。

ですが、このままでは子クラス独自のメソッドは使えません。
この場合はキャストする必要があるようです。

投稿2017/01/10 03:45

BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

A.javaというインターフェースとB.java C.java というクラスがあり、B.java C.javaはA.javaを実装しているとします
B.java C.javaをインスタンス化するには、
B b = new B();
C c = new C();
という風にクラス名の型でインスタンス化することもできますが
A b = new B();
A c = new C();
という風に実装しているインターフェースの型でもインスタンス化することができます
これを使うと
A[] a = new a[2];
a[0] = new B();
a[1] = new C();
a[0].メソッド名;
a[1].メソッド名;
という風に同じクラスのオブジェクトのように使うことができるので、これを繋ぐということだと理解しています

投稿2017/01/11 14:41

Test1115Test

総合スコア52

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問