2

なぜこれがコンパイルされるのですか?(Oracle Java 5 と Java 6 の両方で試してみました (はい、わかっています。適応が遅いです)

public abstract class BaseClass
{
    public abstract void methodA(String abc);

    public abstract String methodB(String abc);
}

public final class ConcreteClass
extends BaseClass
{
}

これらの 2 つのクラスを別々のファイルにポップし、それらに対して javac を呼び出してpoofを実行すると、コンパイルされます。抽象メソッドは実装者によって実装されることを意図しているため、これは意味がありません。これをもう少し試してみると、コードのチャンクが実装されていないメソッドを呼び出そうとしたときにのみコンパイル エラーが発生します。

繰り返しになりますが、ここでの私の質問は、コンパイラがこれを許可する理由 (または、なぜこれを行う必要があるのか​​) を知っている人はいますか?

追加コメント:

  • 最初のテストを行ったとき、元々 ConcreteClass を final としてマークしていませんでした。別のクラスがクラスを拡張できるので、コンパイラは文句を言わず、後で他のクラスがダウンするだろうと想定する可能性があります。道路はそれを処理しますが、クラスを最終としてマークすると、そうではないことがかなり明確になります。
4

2 に答える 2

1

@Jigar がコメントで述べているように、間違ったバージョンのBaseClass. コードをコンパイルしようとすると、次のエラーが発生します。

/Users/ShirishP/Desktop/ConcreteClass.java:1: ConcreteClass is not abstract and does not override abstract method methodB(java.lang.String) in BaseClass
public final class ConcreteClass extends BaseClass
             ^
1 error
于 2012-06-07T17:05:15.870 に答える
-1

意図的ではないかもしれません。抽象クラスについて静的に文句を言うコードは、クラスが宣言されたときではなく、メソッド呼び出しがコンパイルされたときに実行される可能性があります (メソッドの呼び出しは、宣言ではなく潜在的に悪い部分であるため)。それは間違いなく追加できるものですが、有用なものは何もキャッチされないため、価値がないと判断した可能性があります.

于 2012-06-07T17:00:46.307 に答える