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

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

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

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

Q&A

解決済

2回答

2185閲覧

2つのプログラムの違いについて

wakataku1318

総合スコア19

Java

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

0グッド

0クリップ

投稿2017/02/06 08:17

###前提・実現したいこと
以下の2つのプログラムの違いはなんでしょうか?
1つ目のプログラムはウィンドウ右上の×ボタンを押したときにウィンドウを閉じる操作をすることはわかりましたが、2つ目のプログラムがどういうものなのかがわかりません。
1つ目と同じwindowClosing()があって、それ以外にも機能を追加したといことでしょうか?

###1つ目のソースコード

java

1import java.awt.event.*; 2 3 4class MyWindowAdapter extends WindowAdapter{ 5 6 public void windowClosing(WindowEvent e){ 7 8 System.exit(0); 9 10 } 11 12}

###2つ目のソースコード

java

1import java.awt.event.*; 2 3 4public class MyWindowListener implements WindowListener { 5 6public void windowClosing(WindowEvent e) { System.exit(0); } 7 8public void windowOpened(WindowEvent e) {} 9 10public void windowClosed(WindowEvent e) {} 11 12public void windowIconified(WindowEvent e) {} 13 14public void windowDeiconified(WindowEvent e) {} 15 16public void windowActivated(WindowEvent e) {} 17 18public void windowDeactivated(WindowEvent e) {} 19 20}

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

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

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

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

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

guest

回答2

0

ベストアンサー

1つ目は「WindowAdapter」を「継承」したクラスのコードで、2つ目は「WindowListener」を「実装」したクラスになります。
WindowAdapterのリファレンスを確認するとわかりますが、WindowAdapterはWindowListenerを実装しています。WindowAdapterは、2つ目のコードのように、「特になにもしないのにオーバーライドして空のメソッドを実装しなければならない」ことを回避するために、あらかじめ「全部空っぽで実装してあるクラス」なのです。

1つ目と同じwindowClosing()があって、それ以外にも機能を追加したといことでしょうか?

つまりこれは逆なのです。機能が増えたのではなく、コードが汚くならないようにするために、不要な機能を先につぶしておいたのがWindowAdapterです。これなら「必要なメソッド」だけオーバーライドすれば済む話ですからね。

じゃあWindowListenerなんていらなくて、最初から全部WindowAdapterで作ればいいじゃないか、という考えに至るかもしれませんが、WindowListenerは「インタフェース」であり、WindowAdapterは「クラス」であることが重要なポイントです。
Javaの制約上、多重にクラスを継承することはできません。しかし、インタフェースはいくらでも同時に実装ができます。なのでWindowAdapterだけでは困る場面もあります。

投稿2017/02/06 08:25

masaya_ohashi

総合スコア9206

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

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

wakataku1318

2017/02/06 09:21

ありがとうございます! なるほど…継承したものと実装したもので結構違うんですね… 用途にあわせた使い方があるのがわかりました! ありがとうございました!
guest

0

実質違いはありません。

どちらの例もMyWindowListnerはWindowListenerインターフェースを実装した具象クラスになり機能も同一です。

違いは定義のしかたにあります。WindowListnerインターフェースには7つのイベントハンドラーメソッドが定義されていますのでそれを実装する具象クラスはこれら7メソッドを定義しなければなりません。(具象クラスというのは抽象クラスの反対語でインスタンスを直接newできるクラスです。)

1つ目の例では7つのメソッド全てがWindowAdapterで定義されています(ただ、中では何もしない空のメソッドとして定義されています)。このためMyWindowListenerは7つのハンドラーのうち自分が興味のあるメソッドのみをオーバーライドすればよいのです。

一方、2つ目の例ではMyWindowListenerを定義するにあたりimplements WindowListenerとしています。こうすると7つのメソッド全てをMyWindowListnerの中で定義しないと具象クラスにできません。だから中身のないようなものも含めて一々全部定義しなければならないのです。


ちなみに・・・

1つ目のプログラムはウィンドウ右上の×ボタンを押したときにウィンドウを閉じる操作をする

表現の問題なだけですが厳密には「ウィンドウを閉じる操作をユーザーがした際にプログラムを終了する」という意味です。ここで使っているSystem.exitは「プログラムを終了させるメソッド」でして「ウィンドウと閉じるメソッド」と表現しないほうがいいです。

投稿2017/02/06 08:45

KSwordOfHaste

総合スコア18392

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

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

wakataku1318

2017/02/06 09:23

ありがとうございます! 最後のご指摘感謝いたします。 確かに表現の仕方としては不適切でしたね…。 またひとつ勉強になりました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問