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

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

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

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

インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

Q&A

4回答

1854閲覧

Javaのインターフェースについて

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

0グッド

0クリップ

投稿2016/12/24 21:43

例えばスレッドを処理するRunnableインターフェースがありますが、Runnnableインターフェースには何も実装されていないのに、なぜスレッド処理のようなことが可能なのでしょうか?

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

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

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

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

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

guest

回答4

0

スレッド処理をするThreadクラスは、コンストラクタで受け取ったオブジェクトのrunメソッドを実行する仕組みになっています。このオブジェクトはrunメソッドさえ持っていれば十分で、それが実際にどういうものであるとか、どういった仕組みで動いているかなどは関係ありません。

ここで問題になるのは、渡されるオブジェクトがrunメソッドを確実に持っているかということです。Threadの仕組み上、runメソッドを持って入れば何でも受け入れたいところですが、Javaは型安全性を優先するため、変数の型となるクラスで宣言もしくはその親クラスから継承されているメソッドしか使うことができません。
Objectクラスはrunメソッドを持っておらず(持たせると何でもかんでも別スレッド処理できるようになってしまい危険)、特定のクラスにrunメソッドを持たせて継承して使うとすると、別スレッド処理のためだけにそのクラスを継承する必要があり、(Javaでは多重継承はできないため)本来の機能として別のクラスを継承したいのにできないという本末転倒なことになります。この問題を解消するのがRunnableインタフェースの存在です。

Runnableインタフェース自体はスレッド処理に関しては何もしませんが、あるクラスにRunnableインタフェースを実装することは、そのクラスがrunメソッドを持っていることを保証します。その保証を付けることで、安全にThreadのコンストラクタに渡せるようになっているのです。

投稿2016/12/24 23:34

編集2016/12/27 01:57
swordone

総合スコア20651

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

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

0

インタフェースそのものに実装を記述することはありません。あくまでもメソッドの宣言がされているだけです。(この他定数の定義はできます)また、インタフェースを単独で使用することは禁止されています。(使用する際には、必ず実装クラスの作成を経由しなければならない)

例えばRunnableについては「run」というメソッドが宣言されており、実装クラス作成時にこの中身を具体的に定義することを要求します。

したがって、Runnableインタフェースを使用する際には、「run」メソッドを具体的に定義した実装クラスが必要となるので、使用者側から見れば「実装がない」ということは起こり得ません。

投稿2016/12/25 03:33

編集2016/12/25 03:34
HogeAnimalLover

総合スコア4830

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

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

amadablam

2016/12/25 23:48

少なくとも現行の仕様(Java 8)ではインターフェイスにメソッドの実装を記述可能なためこの説明は厳密には正しくありません。
退会済みユーザー

退会済みユーザー

2016/12/26 00:04 編集

Runnable インターフェースの例ではこれで正解では? まあ但し書きで default 宣言メソッド宣言されている場合は除くが必要かもしれないが  標準ライブラリにそれは存在しなかったはず
amadablam

2016/12/26 00:11

元の質問を読めば、質問者の理解が「Runnable」インターフェイス固有の事項ではなく、「インターフェイス」そのものの概念が理解できていないことが想定されます。Runnableインターフェイスは単に例として挙げられているだけです(質問者が書いているように「例えばスレッドを処理するRunnableインターフェース」という部分)。したがってentry01さんのインターフェイスそのものに対する説明として「厳密には」正しくないと書きました。
HogeAnimalLover

2016/12/26 20:33

おお、調べなおしましたらdefault methodなるものがjava8から導入されているようですね。ありがとうございます。
amadablam

2016/12/26 20:52

default methodだけでなく、static methodもインターフェイス内に記述できるようになったため、Java 8ではインターフェイスの仕様が大きく変わりましたね。
guest

0

クラスがスレッド処理可能なのはThreadクラスを継承しているからです。ThreadクラスでRunnnableインターフェースがimplementsされ、スレッド処理可能なように実装されています。

投稿2016/12/24 23:22

naomi3

総合スコア1105

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

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

0

アプリケーションが動いているということは、その時点ですでにスレッドが1つはあるということになります。
runが呼び出された場合、呼び出し元のスレッドで実行されます。

一方、Thread.start()は、新しくスレッドを立ち上げます。

投稿2016/12/24 22:26

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問