私はいくつかの宿題に取り組んでおり、以前の試験問題で、特定の UML ダイアグラム内のすべての抽象クラスに名前を付けるよう求められています。かなり簡単だと思います。1 つの抽象クラスと 3 つのインターフェイスがあります。一般に、これらのインターフェイスは抽象クラスとして認められますか?
8 に答える
技術的には、インターフェースはJavaのような言語ではクラスとして表現されるかもしれませんが、私はそれらをクラスとは見なしません。
概要?もちろん。クラス?いいえ。
インターフェースはコンストラクターを持つことはできず、プロパティ、フィールド、関数本体なども持つことができません。インターフェースは継承できず、実装されます (繰り返しますが、技術的には、インターフェースの実装が実際に特定の言語でそれを継承していることは事実かもしれませんが、それは私の主張ではありません)。インターフェイスは、クラスのような動作をまったく定義しないため、「コントラクト」に似ています。
もしこれが宿題なら、先生とこの種のことについて議論するべきではありません。講義ノートをチェックして、「クラス」という言葉が教師のインターフェイスの定義のどこかに言及されているかどうかを確認してください.
すべてのインターフェースは確かに抽象的です
実際には、メソッドをインターフェース内で抽象として宣言できます...「checkstyle」ツールを除いて、abstract キーワードが冗長であることがわかります。そして、すべてのメソッドは公開されています。
クラスがインターフェイスを実装し、そのすべてのメソッドを実装していない場合は、abstract としてマークする必要があります。クラスが抽象の場合、そのサブクラスの 1 つが実装されていないメソッドを実装することが期待されます。
他の回答をエコーするために、インターフェイスはクラスではありません。
インターフェイスは、クラスに似た参照型であり、定数、メソッド シグネチャ、および入れ子になった型のみを含めることができます。メソッド本体はありません。インターフェイスはインスタンス化できません。クラスによって実装されるか、他のインターフェイスによって拡張されるだけです。
インターフェイスはクラスと組み合わせて機能しますが、クラス階層の一部ではありません。
新しいインターフェイスを定義すると、新しい参照データ型が定義されます。インターフェイス名は、他のデータ型名を使用できる場所ならどこでも使用できます。型がインターフェイスである参照変数を定義する場合、それに割り当てるオブジェクトは、インターフェイスを実装するクラスのインスタンスでなければなりません
インターフェイスがクラスではない理由をより適切に説明するには、次の点を考慮してください。
1/ インターフェースは値によって使用されるタイプです
2/ オブジェクト用のクラス
3/:
Object a = new Date();
String s = a.toString();
- 変数「a」の型は Object です (これは、実際には Java ソース コードの型表記であり、Object への参照を意味します)。
- しかし、それが指すオブジェクトのクラスは Date です。
型 (オブジェクト) は、コンパイラの型チェックに従ってどのコードが有効であるかにのみ影響しますが、コードが実際に何をするかには影響しません。
オブジェクトのクラスはコードの動作に影響を与えるため、2 行目の a.toString() 呼び出しは、"java.lang.Object@XXXXXXXX" のような文字列ではなく、日付のような文字列を返します。
インターフェイスは型であるため、値のみに使用され、実行時にオブジェクトが実際に何をするかを表すものではありません。
ただし、Java では話にひねりがあります。Java のすべてのインターフェイスは java.lang.Object を拡張します。メソッドを追加してみてください:
public void notify();
インターフェースで何が起こるか見てください..
クラスを拡張するインターフェース - それはインターフェースをクラスにしますか? それともクラスはインターフェイス?? ええと..インターフェースの実装がとにかく拡張しなければならなかったjava.lang.Objectの定義をオーバーライドするインターフェースを防ぐために行わなければならなかったのはハックだったと思います。
はい、インターフェイスは暗黙的に抽象です。.class
ファイル にエンコードされる方法については、舞台裏を見てください。
ただし、セマンティクスは面白いものです。試験条件下では、「抽象クラス」は、クラスの宣言 .java
を使用して、ソース ファイルから文字通りコンパイルする必要があります。abstract class
あなたは抽象側についてのみ尋ねましたが、クラス側を忘れないでください-私はインターフェースをクラスとは呼びません.抽象クラスとして。ただし、それを明示的に説明する価値があるかもしれません:)
インターフェイスには、定義ではなくメソッドのプロトタイプ (宣言) が含まれていますが、抽象クラスにはメソッドの定義と少なくとも 1 つの抽象メソッド (プロトタイプのみのメソッド) を含めることができます。
インターフェイスは、オブジェクトの継承を壊すために使用されます。複数のクラスおよびクラス階層の 2 つ以上のオブジェクトを保持できます。インターフェイスをコンセント プラグと見なします。インターフェイスを実装するすべてのクラスにはインターフェイスが必要です。これは、コンピューター、コーヒー メーカー、人工呼吸器、冷蔵庫が電力を得るために同じデバイスを必要とするのと同じです。
抽象クラスはインターフェイスのように見えます。抽象クラスは実装を持つことができますが、インターフェースは実装を持つことができません。
それから、質問があります。メソッドシグネチャしかない場合、抽象クラスをインターフェースとして呼び出すことはできますか?
インターフェイスとは異なり、抽象クラスはクラスだと思います。抽象クラスからクラスを継承するときに行うルックアップがあるため、使用するのにコストがかかります。