この興味深く重要な質問は、Java 開発者のポジションの電話面接中に読者の 1 人に尋ねられました。
彼はJava 言語で抽象クラスを作成することfinal
が不可能であることを知っていましたが、質問の文言に混乱しました。答えは簡単です。いいえ、
final
-class 内に抽象メソッドを含めることはできません。なぜ?Java 言語クラスで抽象メソッドを宣言すると、そのクラスは自動的に抽象クラスになるため、
final
Java 言語で抽象クラスを作成することはできません。これは、Java クラスに抽象メソッドを
final
含めることはできないこと を意味します。
多くの Java 開発者は、この質問に答えるときに言葉遣いのせいで混乱してしまいます。たとえ質問者が一般的な概念に精通していても、クラス内で抽象メソッドを宣言するとクラスが抽象になり、Java では抽象クラスを作成できないことを理解していない可能性があります
final
。この点が、この質問と、より一般的で頻繁に寄せられる質問、つまり
Java では、クラスを抽象クラスと最終クラスとして同時に宣言することは可能ですか? とは区別されます。final
-class で抽象メソッドを宣言できないことを 示すコード例を見てみましょう。抽象メソッドを持つ という名前のクラス
Hello.java
を作成しましょう。
public final
Hello
print()
public final class Hello {
public abstract void print();
}
このコードを IDE に入力すると、次のエラー メッセージが表示されます。
Hello
抽象メソッドを宣言できるようにするには、このコードを抽象クラスにする必要があると言われます。
このコードをメモ帳に入力し、コマンド ラインから javac ユーティリティを使用してコンパイルした場合も、同じことが起こります。Javaの仕様では、クラス内で抽象メソッドを宣言するとそのクラスは抽象クラスとなり、
final
Javaでは抽象クラスを作ることができないため、コンパイラでエラーが発生します。これは、Java 言語の最上位クラスとネストされたクラスの両方に当てはまります。ネストされた -class 内で抽象メソッドを宣言した場合でも
final
、エラーは同じになります。関連するもう 1 つの質問は、
Java の抽象クラスに静的メソッドを含めることができるかということです。 回答:はい、可能です。静的メソッドを使用するためにクラスのインスタンスを作成する必要がなく、クラス名を使用するだけで呼び出すことができるため、抽象クラスで静的メソッドを宣言することに問題はありません。以下に示すように、 この例を変更して、Java では静的な
Hello
メソッドをclass に含めることができます。
main()
public abstract class Hello {
public abstract void print();
public static void main(String args[]) {
}
}
ご覧のとおり、コンパイル エラーはスローされません。Java では抽象クラスで静的メソッドを完全に安全に宣言できるため、このコードは問題なくコンパイルされます。
簡単な結論-class で抽象メソッドを宣言することは不可能です
final
。これを行うと、Java 仕様に従って、クラスは自動的に抽象になるためです。また、
final
Java の -class は抽象化できないため、これは受け入れられず、コンパイラはエラーをスローしてこれを禁止します。ただし、静的メソッドは最終クラスと抽象クラスの両方で宣言できます。これについては問題ありません。
GO TO FULL VERSION