1. ホーム
  2. java

[解決済み] なぜJavaでは静的メソッドを抽象化できないのですか?

2022-03-15 05:57:02

質問

Javaでは、なぜ抽象的な静的メソッドを定義できないのでしょうか? 例えば、以下のような場合です。

abstract class foo {
    abstract void bar( ); // <-- this is ok
    abstract static void bar2(); //<-- this isn't why?
}

解決方法は?

その abstract アノテーションは、そのメソッドがサブクラスでオーバーライドされなければならない (MUST)ことを示します。

Javaでは static メンバ (メソッドまたはフィールド) をサブクラスでオーバーライドすることはできません (これは他のオブジェクト指向言語では必ずしも当てはまりません。SmallTalk を参照してください)。 A static メンバは 隠された とは根本的に異なります。 オーバーライド .

静的メンバはサブクラスでオーバーライドすることができないので abstract アノテーションは適用できません。

余談ですが、他の言語でもインスタンス継承と同じように静的継承をサポートしています。 構文の観点からは、それらの言語では通常、クラス名を文に含める必要があります。 例えば、Javaでは、ClassAでコードを書いていると仮定すると、これらは同等のステートメントです(methodA()が静的メソッドであり、同じシグネチャを持つインスタンスメソッドが存在しない場合)。

ClassA.methodA();

そして

methodA();

SmallTalkでは、クラス名はオプションではないので、この構文になります(SmallTalkでは、"subject" と "verb" を分けるために .を使用せず、代わりに statemend ターミネータとして使用していることに注意してください)。

ClassA methodA.

クラス名は常に必須であるため、クラス階層をたどることでメソッドの正しいバージョン"version"を常に決定することができます。 参考までに、私はときどき static Javaを始めたばかりの頃は、静的継承がないことに閉口していました。 さらに、SmallTalkはアヒル型です(そのため、プログラムバイコントラクトをサポートしていません)。 abstract 修飾子でクラスメンバを指定します。