No.1
- 回答日時:
・コンストラクタ
コンストラクタがないと、インスタンスの初期化処理は、別にメソッドなどで用意し、newしたらそれを呼び出すような形になる。となると、初期化メソッドの呼び忘れでエラーになったりするトラブルが続出するだろう。newすれば自動的に実行されるコンストラクタがあることで、安心してインスタンスが作れる。
・継承
例えば、AWTとかSwingとかのGUIを使って、ウインドウを表示したプログラムを作る場合、継承を利用すれば、FrameやJFrameといった、既に用意されているウインドウの土台となるクラスを継承して簡単に作れる。、継承がないと、ウインドウを作り、各種のイベントに応じて表示を更新したり動かしたりする処理をすべて自分で書かないといけない。すべてにおいて、そうやって「全部、一から作る」ことになる。ウインドウを表示してボタンをクリックして何か実行、なんてものは、継承を使えばせいぜい数十行でできるが、継承がなくすべて自分で実装するとなると、下手すると千行以上書かないといけない。
・インターフェース
例えば、ウインドウを使ったプログラムで、ボタンをクリックしたらこれこれの処理をする、というような場合、ActionListenerを組み込んで処理を作る。これは、考えてみると不思議なことだ。ボタンには、ActionListenerなんて入っていない。が、これをaddすると勝手にリスナーを認識して動く。ということは、ボタンは、ActionListenerが入っていないのに、「もし、これにActionListenerが組み込まれたらこう動く」ということをあらかじめ想定して作られている、ということになる。これは、インターフェースにより「こういうふうな機能を持っているもの」ということをあらかじめ定義しておくことができるから可能なことだ。インターフェースにより、さまざまな部品の定義だけをあらかじめ用意し、(実際のクラスはまだないのに)それがあるものとしてプログラムを作っていける。そして、後から必要に応じて実際のクラスを作って設定すれば、ちゃんと動いてくれる。インターフェースを実装しさえすれば、どんなクラスでもそこにはめ込んで動かせる。こういうプログラムをプラグイン的に組み合わせてちゃんと動くようにできるのは、インターフェースがあるからこそだ。
No.2
- 回答日時:
確かにインターフェースや継承を使わなくてもプログラムは作れます。
ですが、便利な機能であるのに敢えて使わない理由も無いでしょう。
ほとんどの場合インターフェースや継承を使った方が
効率的に設計・製造できますし、何よりフレームワークやAPIなど
既存の便利な仕組みを活用することができます。
例えばjava.utilのListインターフェースなどですね。
コンストラクタはどう考えても必要でしょう。
Javaの言語仕様上、明示的であるにしろないにしろ
コンストラクタを使わずにインスタンスを作ることは
推奨されませんし、通常はまず行いません。
逆にコンストラクタを使わなくてよいのでは、
との考えに至った経緯を知りたいです。
No.3ベストアンサー
- 回答日時:
単純な例題などでは必要性を感じないでしょうね。
実際不要だし…しかし、プロジェクトが複数で、パッケージが200~300、ソースが
2000以上などと言う規模になると、必要になってきます。
コンストラクタ
早い話がクラスの初期設定です。不要なら空の記述でかまいません。
ただ、面白い使い方があります。コンストラクタの属性をprivate、
あるいは「無し」にします。前者は特定の方法でしかインスタンスを
作れないようにする、後者は同一パッケージ内でのみインスタンスを
作れるようにする場合です。プロジェクトが大きく、これに携わる
プログラマの技量にバラつきがある場合、不要な混乱を避けるという
効果があります。また、マルチスレッドで、クリティカルな制御を
する場合(複数の処理スレッドが同時に実行された時に混乱しない
ようにするための制御)などに使います。
インターフェース
これは分かり難い。事実、技量不足のプログラマに作らせると、
とんでもないバグの原因になったりしますので、使い方も難しい。
例え話:会社の支店を考えましょう。支店には必ず支店長、住所が
あるものとします。しかし、新宿支店には特設会場があり、渋谷支店
には保養所がある。この状態で支店住所を処理するプログラムがある
とすると、支店が新宿なら…、渋谷なら…、○○なら…というように
しなければなりませんね。でも、各支店が支店インターフェースを
持ち、これに支店長と住所があると記載されていれば、プログラムは
「支店の住所」とするだけで良いのです。
同様の使い方をするものに抽象クラスというものがあります。
個人的にはこちらの方が好みです。間違いが少ないし、手続実体を
記述することができます。
継承
機能A、B、Cを持つクラスXがあるとします。仕様が変更になり、
機能Dを追加したとします。直接、Xを修正しても良いのですが、
既存機能A、B、Cが影響を受けていないかどうかを再テストする
必要があります。しかし、Xを継承したクラスYを作り、ここには
機能Dだけを記述します。この場合は機能Dのテストだけで十分と
言えます。(作り方がマズイと継承元の機能に影響することもある)
クラスYはXを継承しているので、機能A、B、Cを持っています。
また、ある共通機能を持つクラスを独立させておくと、これを使う
場合、このクラスをインスタンス化する必要がありますが、この
クラスを継承すると、インスタンス化する必要はなく、自身の
メソッドを呼ぶのと全く同じ感覚で実行することができます。
他にも継承の恩恵は数多くありますが、長くなるので、この辺で
止めます。
と、まぁ文章で語るとこんな具合で、どうしても抽象概念しか分かり
ませんよね。感覚的に「こういうもんだ」と分かるには実経験を
積んで、いろいろな場面に遭遇するしかないでしょうね。
たくさんの方の詳しい回答を、戴きまして
ありがとうございます。
例題プログラムを、
コマンドプロンプトからせっせと
タイプしているレベルなので、
助かります。
コンストラクタもインタフェースも、
何でこんなのワザワザ設定してるんだろ・・・
を、思いながらやってました。
早く悩めるレベル目指して、頑張ります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- CPU・メモリ・マザーボード Socket AM4マザーに、レガシーなインタフェースが多数あるのはなぜ? 3 2023/02/17 10:47
- 弁護士・行政書士・司法書士・社会保険労務士 管理費滞納債務の特定承継人への承継 6 2022/04/02 16:59
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- 電気・ガス・水道業 ダイナミックマイクと、コンデンサマイクについて教えて欲しいのですが、PCなどはコンデンサマイクに対応 5 2022/08/15 07:13
- C言語・C++・C# C# 継承の問題で programに示された拡張をすべて含んだ上で,クラス Mammal に,そのオ 1 2022/07/22 09:48
- 医療・安全 塩野義製薬の新型コロナ治療薬「ゾコーバ」の緊急承認見送り 7 2022/07/22 00:45
- 弁護士・行政書士・司法書士・社会保険労務士 ★行政書士試験の民法についての質問になります。 物権変動についての質問になります。 問 不動産の取得 1 2023/05/24 19:36
- その他(悩み相談・人生相談) 回答者さんだったらどっちを選びますか?理由も教えてください! 貴方の身内の中で長年にわたり会社経営を 3 2022/09/23 20:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
抽象クラスをJUNITでテストする...
-
抽象クラスからオーバーライド...
-
JavaにListElement型ってあるん...
-
「ラッパークラス」の存在意義...
-
オーバーライドとラッパーの違い
-
C#からDLLを呼びたいのですが・...
-
vb.net 自作プロパティの削除に...
-
(vba)他のアプリケーションの右...
-
setTextについて
-
抽象クラスのエラーが出ます
-
委譲って何ですか?
-
単体テストのテストケースにて...
-
【C#】クラスのコンストラクタ...
-
JavaでのAPIの覚え方ってみさな...
-
オブジェクト指向の特徴
-
JTextFieldの入力制限
-
ASP.NETでの共通コードの書き方...
-
「インターフェイス」って何の...
-
「IOException は対応する try ...
-
Javaのインターフェイスの意味
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
interface,extend,implementの...
-
(vba)他のアプリケーションの右...
-
抽象クラスをJUNITでテストする...
-
「ラッパークラス」の存在意義...
-
ASP.NETでの共通コードの書き方...
-
JTextFieldの入力制限
-
「継承されたメソッドの可視性...
-
C# 「データが失なわれる可能性...
-
VB DLLプロジェクトについて
-
c++でのヘッダーファイルの循環...
-
【C#】クラスのコンストラクタ...
-
「IOException は対応する try ...
-
ファイルパスが取得出来ない(P...
-
メソッドの引数にクラス名を渡す
-
ゲッターを使わないで変数にア...
-
Javaのインスタンス化の構文の...
-
オーバーライドとラッパーの違い
-
vb.net 自作プロパティの削除に...
-
なぜインタフェースを使うのか?
-
VBがオブジェクト指向言語でな...
おすすめ情報