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

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

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

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

Q&A

解決済

3回答

1949閲覧

インスタンスと型について

omikuji

総合スコア60

Java

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

0グッド

0クリップ

投稿2016/07/17 10:15

こんにちは。最近Java SE8 Programmerの試験の勉強をしております。実務はほとんどゼロで、この資格でプログラミングの勉強をしている感じです。
その中で気になった点があるので質問させて頂きます。

java

1interface Worker{ 2 void work(); 3} 4 5class Employee{ 6 public void work(){ 7 System.out.println("work"); 8 } 9} 10 11class Engineer extends Employee implements Worker{} 12 13public class Main{ 14 public static void main(String[] args){ 15 Worker worker = new Engineer(); 16 worker.work(); 17 } 18}

このコードを入力すると、workと表示されて終わると思います。
自分の疑問点としてはEngineerインスタンスをEngineer型で扱っても問題なくプログラムは動くと思いますが、EngineerインスタンスをWorker型として扱おうとしている理由がわかりません。このコードに限らず、こういったことをする理由・利点はあるのでしょうか?

またこちらは確認ですが、WorkerインスタンスをEngineer型として扱うことはできないという認識でまちがいないでしょうか?もし簡単であれば説明していただけるとありがたいです。

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

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

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

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

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

guest

回答3

0

ベストアンサー

こちらの質問と同様ですね。

この場面では多分Java仕様の理解について問いたいからだと思います。コンパイルエラーにるか等が選択肢にあると思います。あくまでも問題の為のコードだと思います。

しかし、実際のコードでもインターフェースの型変数にそのインターフェースを実装したクラスのインスタンスを入れて使うことはあります。
それはインターフェースが複数のクラスに実装されていてそれらをリストとして扱いたい場合や複数のクラスを区別なく使うためです。

例を挙げると、通常の職場ではエンジニアだけでなく事務、営業などがいて、みんな働いています。作業内容はそれぞれ違いますが行為は「作業する」ですよね。
Javaでみんなに「働け」と命令をするならリストに入れてfor文とかにしたいですよね。これを実現できるのがインターフェースに実装クラスのインスタンスを入れることで実現できます。

投稿2016/07/17 10:31

yona

総合スコア18155

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

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

0

EngineerインスタンスをWorker型として扱おうとしている理由がわかりません。

簡単に言うなら、他のWorker実装クラス型に簡単に挿げ替えられる実際の実装を隠蔽できるなどのメリットがあります。
Javaを勉強しているならオブジェクト指向という言葉を聞いたことがあるかと思います。オブジェクト指向の目的の一つに隠蔽というものがあります。単純に言うなら、Workerというインタフェースはwork()という行動をするということだけ公開して、具体的に何をするかはそれを実装するクラスに任せて、外からはその内部を見えないようにしてしまおうということです。外から見えないように、また操作できないようにすることで、そのクラスの安全性を高める、扱いが簡素になるという効果も生まれます。
このような簡単なプログラムではその効果はわかりづらいですが、今は「インタフェース型で変数を宣言して入れる」と理解しておくのがいいのではないでしょうか?

WorkerインスタンスをEngineer型として扱うことはできない

そもそもWorkerというインタフェースのインスタンスを作ることは不可能です。

投稿2016/07/17 10:26

swordone

総合スコア20651

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

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

0

これはイベントの処理の時によく用いられます。

interfaceのメソッドにはpublic abstractが付きます。
つまり、Workerインターフェースを実装しているクラスはすべてそのメソッドを宣言しています。
どんなクラスのオブジェクトを受け取ってもメソッドが発見できなかったというエラーが起きません。

必ず特定の名前のメソッドを違う処理内容で受け取れるので、「処理を渡す」「処理を受け取る」ということが安全にできます。Interfaceによって宣言されているので間違えようがありません。
この特性から、システムが呼び出すイベント処理に自分の実行したいメソッドを渡すということが実現できます。
AndroidではOnClickListenerが有名ですね。

クラスをいちいち宣言しなくても、インターフェースを実装しつつオブジェクトを生成できます

java

1Worker w = new Worker(){ 2 public void work(){ 3 System.out.println("work"); 4 } 5};

javaでファーストオブジェクトが扱えるなら、メソッドを渡す処理がこんなに複雑にならなかったんでしょうか。

投稿2016/07/17 16:25

intelf___

総合スコア868

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

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

swordone

2016/07/17 22:16

Java8で、このような「抽象メソッドを1つだけ持つインタフェース」を「関数型インタフェース」と呼び、ラムダ式などで実装を簡単に書けるようになりました。
intelf___

2016/07/19 07:11

ありがとうございます。 そういえばありましたね Androidでのイベント処理をすることが多かったので、すっかり忘れていました Androidはjava8が使えないので... と思いましたが調べてみたらツールを使うと使えるそう。 調べるきっかけができたのも含めてありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問