
No.3ベストアンサー
- 回答日時:
単純な例題などでは必要性を感じないでしょうね。
実際不要だし…しかし、プロジェクトが複数で、パッケージが200~300、ソースが
2000以上などと言う規模になると、必要になってきます。
コンストラクタ
早い話がクラスの初期設定です。不要なら空の記述でかまいません。
ただ、面白い使い方があります。コンストラクタの属性をprivate、
あるいは「無し」にします。前者は特定の方法でしかインスタンスを
作れないようにする、後者は同一パッケージ内でのみインスタンスを
作れるようにする場合です。プロジェクトが大きく、これに携わる
プログラマの技量にバラつきがある場合、不要な混乱を避けるという
効果があります。また、マルチスレッドで、クリティカルな制御を
する場合(複数の処理スレッドが同時に実行された時に混乱しない
ようにするための制御)などに使います。
インターフェース
これは分かり難い。事実、技量不足のプログラマに作らせると、
とんでもないバグの原因になったりしますので、使い方も難しい。
例え話:会社の支店を考えましょう。支店には必ず支店長、住所が
あるものとします。しかし、新宿支店には特設会場があり、渋谷支店
には保養所がある。この状態で支店住所を処理するプログラムがある
とすると、支店が新宿なら…、渋谷なら…、○○なら…というように
しなければなりませんね。でも、各支店が支店インターフェースを
持ち、これに支店長と住所があると記載されていれば、プログラムは
「支店の住所」とするだけで良いのです。
同様の使い方をするものに抽象クラスというものがあります。
個人的にはこちらの方が好みです。間違いが少ないし、手続実体を
記述することができます。
継承
機能A、B、Cを持つクラスXがあるとします。仕様が変更になり、
機能Dを追加したとします。直接、Xを修正しても良いのですが、
既存機能A、B、Cが影響を受けていないかどうかを再テストする
必要があります。しかし、Xを継承したクラスYを作り、ここには
機能Dだけを記述します。この場合は機能Dのテストだけで十分と
言えます。(作り方がマズイと継承元の機能に影響することもある)
クラスYはXを継承しているので、機能A、B、Cを持っています。
また、ある共通機能を持つクラスを独立させておくと、これを使う
場合、このクラスをインスタンス化する必要がありますが、この
クラスを継承すると、インスタンス化する必要はなく、自身の
メソッドを呼ぶのと全く同じ感覚で実行することができます。
他にも継承の恩恵は数多くありますが、長くなるので、この辺で
止めます。
と、まぁ文章で語るとこんな具合で、どうしても抽象概念しか分かり
ませんよね。感覚的に「こういうもんだ」と分かるには実経験を
積んで、いろいろな場面に遭遇するしかないでしょうね。
たくさんの方の詳しい回答を、戴きまして
ありがとうございます。
例題プログラムを、
コマンドプロンプトからせっせと
タイプしているレベルなので、
助かります。
コンストラクタもインタフェースも、
何でこんなのワザワザ設定してるんだろ・・・
を、思いながらやってました。
早く悩めるレベル目指して、頑張ります。
No.2
- 回答日時:
確かにインターフェースや継承を使わなくてもプログラムは作れます。
ですが、便利な機能であるのに敢えて使わない理由も無いでしょう。
ほとんどの場合インターフェースや継承を使った方が
効率的に設計・製造できますし、何よりフレームワークやAPIなど
既存の便利な仕組みを活用することができます。
例えばjava.utilのListインターフェースなどですね。
コンストラクタはどう考えても必要でしょう。
Javaの言語仕様上、明示的であるにしろないにしろ
コンストラクタを使わずにインスタンスを作ることは
推奨されませんし、通常はまず行いません。
逆にコンストラクタを使わなくてよいのでは、
との考えに至った経緯を知りたいです。
No.1
- 回答日時:
・コンストラクタ
コンストラクタがないと、インスタンスの初期化処理は、別にメソッドなどで用意し、newしたらそれを呼び出すような形になる。となると、初期化メソッドの呼び忘れでエラーになったりするトラブルが続出するだろう。newすれば自動的に実行されるコンストラクタがあることで、安心してインスタンスが作れる。
・継承
例えば、AWTとかSwingとかのGUIを使って、ウインドウを表示したプログラムを作る場合、継承を利用すれば、FrameやJFrameといった、既に用意されているウインドウの土台となるクラスを継承して簡単に作れる。、継承がないと、ウインドウを作り、各種のイベントに応じて表示を更新したり動かしたりする処理をすべて自分で書かないといけない。すべてにおいて、そうやって「全部、一から作る」ことになる。ウインドウを表示してボタンをクリックして何か実行、なんてものは、継承を使えばせいぜい数十行でできるが、継承がなくすべて自分で実装するとなると、下手すると千行以上書かないといけない。
・インターフェース
例えば、ウインドウを使ったプログラムで、ボタンをクリックしたらこれこれの処理をする、というような場合、ActionListenerを組み込んで処理を作る。これは、考えてみると不思議なことだ。ボタンには、ActionListenerなんて入っていない。が、これをaddすると勝手にリスナーを認識して動く。ということは、ボタンは、ActionListenerが入っていないのに、「もし、これにActionListenerが組み込まれたらこう動く」ということをあらかじめ想定して作られている、ということになる。これは、インターフェースにより「こういうふうな機能を持っているもの」ということをあらかじめ定義しておくことができるから可能なことだ。インターフェースにより、さまざまな部品の定義だけをあらかじめ用意し、(実際のクラスはまだないのに)それがあるものとしてプログラムを作っていける。そして、後から必要に応じて実際のクラスを作って設定すれば、ちゃんと動いてくれる。インターフェースを実装しさえすれば、どんなクラスでもそこにはめ込んで動かせる。こういうプログラムをプラグイン的に組み合わせてちゃんと動くようにできるのは、インターフェースがあるからこそだ。
お探しの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ランキング
-
JAVAでCPUなどのシリアル番...
-
Strutsのバージョンアップによ...
-
【C#】クラスのコンストラクタ...
-
ゲッターを使わないで変数にア...
-
WPF C# PointToClient
-
抽象クラスのエラーが出ます
-
「ラッパークラス」の存在意義...
-
(vba)他のアプリケーションの右...
-
ASP.NETでの共通コードの書き方...
-
C#からDLLを呼びたいのですが・...
-
Javaで下線
-
「継承されたメソッドの可視性...
-
メソッドの引数にクラス名を渡す
-
【設計思想の質問】staticメソ...
-
クラスの動的な関係を表すのは...
-
「タイプ初期化子が例外をスロ...
-
変数の参照でエラーが出てしま...
-
private static という変数の修飾
-
インスタンス参照でアクセスで...
-
エクセルVBAで、条件に一致する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# 「データが失なわれる可能性...
-
「継承されたメソッドの可視性...
-
(vba)他のアプリケーションの右...
-
【C#】クラスのコンストラクタ...
-
VB DLLプロジェクトについて
-
メソッドの引数にクラス名を渡す
-
「ラッパークラス」の存在意義...
-
interface,extend,implementの...
-
c++でのヘッダーファイルの循環...
-
このエラーメッセージの意味を...
-
委譲って何ですか?
-
ゲッターを使わないで変数にア...
-
Javaのインスタンス化の構文の...
-
ファイルパスが取得出来ない(P...
-
ASP.NETでの共通コードの書き方...
-
Commons-Discovery.jarとは?
-
デバッグ時に「Source not found」
-
JTextFieldの入力制限
-
JavaのimplementsをC言語で例え...
-
オーバーライドとラッパーの違い
おすすめ情報