インターフェイスにはコンストラクターがないことを読みました。つまり、スーパークラスの super() は呼び出されません。また、Javaのすべてのクラスがのサブクラスであることも読みましたObject
インターフェイスはどうですか、それはオブジェクトのサブクラスですか? なんで?
いいえ、ちがいます。インターフェイスをインスタンス化してオブジェクトを形成することはできません。これはクラスではありません。
インターフェイスは、暗黙的か明示的かに関係なくクラスを拡張できないため、オブジェクトクラスのサブクラスであるインターフェイスはありません。
コンストラクターの理由は、インスタンスを作成することです。インターフェースは機能を提供しないためインスタンス化できないため、単なるコントラクトであり、クラスのみをインスタンス化できるため、コンストラクターがあります。
インターフェイスは、メソッド定義の名前付きコレクションです(実装なし)。インターフェイスには、定数宣言を含めることもできます。
インターフェイスとクラスにはいくつかの基本的な違いがあり、そのうちの1つはコンストラクターがないことです。実際には、インターフェイスはそのために作成されておらず、インターフェイスをインスタンス化することはできませんが、インターフェイスをインスタンス化できる方法はあります。
interface Interface{
abstract String fun();
}
Interface interfc=new Interface() {
@Override
public String fun() {
return super.toString();
}
};
Type type=interfc.getClass();
ここでは、インターフェースは匿名クラスとしてインスタンス化されていますが、Java言語の仕様に従ってここにコンストラクターを配置することはできません。super
しかし、それでも、この匿名クラスのすぐにスーパークラスになるクラスを使用できます。
An anonymous class cannot have an explicitly declared constructor.
そして、スーパークラスでfinal変数を使用するというこれの代替ソリューションがあります。
インターフェイスはコンストラクターを持つことはできません。インターフェイスは多重継承をサポートしているためです。つまり、クラスが 2 つのインターフェイスを継承する場合、コンストラクターの連鎖により、どのコンストラクターがクラス コンストラクターから呼び出されるかが曖昧になります。
インターフェイスを「is-a」関係ではなく「can-do」関係と考える人もいますが、私はそれらを「__er」または「__able」と考える方が役立つと思います。実世界で例えると、本(枯れ木版)、製本された紙の雑誌、新聞、販促用のチラシ、看板、文字が書かれた紙切れなどはすべて「読めるもの」です。 "。ある人に本を見せて「これは読めますか」と尋ねたら、「読める」と答えるでしょう。逆に、誰かに本を見せて「これは何?」と聞いたら、応答は「読みやすいもの」ではなく、おそらく「本」、またはおそらく「小説の米国第 2 版のハードカバーの第 5 刷」です。
同様に、Java インターフェイスも同様です。オブジェクトは任意の数のインターフェイスを実装できますが、すべてのオブジェクトには、サポートする一連のインターフェイスに加えて型が必要です。インターフェイスを実装する未知の型の新しいオブジェクトを返すメソッドを定義できることに注意してください。これは、どのタイプのオブジェクトが必要かを指定せずに、「何か読むものをください」と誰かに尋ねることと同じです。このようなメソッドは、返すオブジェクトのタイプを選択し、呼び出し元に「読み取り可能な」オブジェクトを与えることができます。ただし、コンストラクターは、一般的なメソッドとは異なり、呼び出し元が目的のオブジェクトの型を正確に指定する必要があります。オブジェクトが「読み取り可能」であることを指定するだけでは、十分な指定にはなりません。