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

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

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

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

Q&A

解決済

2回答

1147閲覧

抽象アダプタクラスのWindowAdapterはnewによるインスタンス化が可能なのはなぜですか?

happywheels4242

総合スコア9

Java

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

0グッド

0クリップ

投稿2020/08/08 10:51

WindowAdapterは、ウィンドウイベントを受け取るための抽象アダプタクラスです。
このクラス内のメソッドは空だと聞いたので当然abstractが使われていてると思ったので

newすると...
エラー: WIndowAdapterはabstractです。インスタンスを生成することはできません
というエラーが出ると予想していたのですがコンパイルが成功してしまいました????

そもそも、「抽象クラスは、newによるインスタンス化が禁止される」
という私の認識が間違えているのでしょうか?
そのへん込みで詳しくわかる方がいれば、解説御願いしますm(__)m

一応、サンプルとしてコードを下においておきます。

Java

1/* 2 * SmplWnd1.java 3 */ 4 5// WindowFoucusListener, WindowListener, WindowStateListener, EventListenerの4つのリスナーインターフェースを実装しているクラス 6// さまざまなイベントを受け取るものをJavaではリスナーという 7import java.awt.event.WindowAdapter; 8 9import java.awt.event.WindowEvent; 10 11import javax.swing.JFrame; 12public class SmplWnd1 extends JFrame { 13 14 SmplWnd1() { 15 /** 16 * -------------------------------------------------------------------------- 17 * 「ウィンドウが」閉じられようとしている」というイベント 18 *  プログラムコードを明示的に受け取ってプログラムを終了するようにする方法 19 * -------------------------------------------------------------------------- 20 **/ 21 // リスナーインターフェースを追加 22 this.addWindowListener(new WindowAdapter() { 23 24 @Override 25 // windowClosingメソッドをオーバーライド 26 public void windowClosing(WindowEvent e) { 27 // 実行中のJVMを終了させる ← 処理の終了させる 28 System.exit(0); 29 } 30 31 }); 32 33 this.setSize(300,220); 34 this.setVisible(true); 35 } 36 37 public static void main(final String args[]) { 38 new SmplWnd1(); 39 } 40}

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

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

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

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

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

guest

回答2

0

抽象メソッドが無くとも抽象クラスである限り、継承はできてもnewはできないはずです。

# 「はず」はどこでご覧になられました?

リスナを内部クラスで書くと、たとえばこう書ける。

java

1import javax.swing.*; 2import java.awt.event.WindowAdapter; 3import java.awt.event.WindowEvent; 4 5public class SmplWnd0 extends JFrame { 6 private static class HogeWindowAdapter extends WindowAdapter { 7 @Override 8 public void windowClosing(WindowEvent e) { 9 System.exit(0); 10 } 11 } 12 13 SmplWnd0() { 14 this.addWindowListener(new HogeWindowAdapter()); 15 this.setSize(300, 220); 16 this.setVisible(true); 17 } 18 19 public static void main(final String args[]) { 20 new SmplWnd0(); 21 } 22}

リスナをうんとたくさんやまほど定義しなければならない状況になったと考えると、リスナクラスの名前(HogeWindowAdapter)をそれぞれ考えるのは面倒くさいぢゃないですか。

だから、無名(匿名)クラスとして、名前のないクラスのインスタンスを生成できる。

java

1 this.addWindowListener(new WindowAdapter() { 2 @Override 3 public void windowClosing(WindowEvent e) { 4 System.exit(0); 5 } 6 });

無名クラスは、抽象クラスではなくて、インタフェースのインスタンスも生成できる。

java

1 final Runnable runnable = new Runnable() { 2 @Override public void run() { ... } 3 };

投稿2020/08/09 07:34

shiketa

総合スコア4061

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

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

happywheels4242

2020/08/10 18:12

スッキリわかるJAVA入門という本を参考にしました。 参考にした部分↓ 抽象メソッド(未完成部分)が1つでもあるクラスは、 抽象クラスにしなければコンパイルが通らない仕組みになっています。 解決策としては、 クラスの宣言時にabstractをつけて抽象クラスにする or クラス内部の未完成部分をなくす(オーバーライドする) の2つがあるようです。
guest

0

ベストアンサー

newすると...

これは、WindowAdapterを直接newしているのではなく、それを継承したローカルクラス無名クラスnewしています。

投稿2020/08/08 10:53

編集2020/08/08 12:36
maisumakun

総合スコア146018

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

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

maisumakun

2020/08/08 10:55

WindowAdapter自体はabstractになってはいますが、抽象メソッドは1つもないので、継承すればnew可能です。
maisumakun

2020/08/08 12:35

確かに用語が微妙ですね。修正しておきます。
happywheels4242

2020/08/09 07:00

少しわからないところがあるのですが、 抽象メソッドが無くとも抽象クラスである限り、継承はできてもnewはできないはずです。 WindowAdapterを継承している場所はどこでしょうか?
maisumakun

2020/08/09 07:08

new WindowAdapter{ /* 実装 */ }自体が、「WindowAdapterを継承して実装部分のコードを実装し、その継承後のクラスをnewする」という意味になります。
happywheels4242

2020/08/10 18:39 編集

なるほど! WindowAdapterオブジェクトを継承して インスタンスを生成(メモリに新しく書き込む)って感じですね。 newは「継承 + インスタンス生成」なんですね! 理解できました???? とてもわかりやすいです\(^o^)/ 勉強になりました、ありがとうございます(*´∀`*)
swordone

2020/08/10 18:44

念のために言っておくと、「new自体」に継承の意味はありません。 匿名クラスとか、無名クラスで調べてください。
happywheels4242

2020/08/11 07:49 編集

ご親切にありがとうございます(*^^*) 無名クラスの利用 = 継承 + new ですね! WindowAdapter adapter = new WindowAdapter(...); → new WindowAdapter(...); ここでは、WindowAdapterクラス(型)を継承して、newですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問