1

次のコードを検討してください

interface MyInterface{
    void method(String s);// if we write static modifier we have compile error
}
class MyClass implements MyInterface{
    public static void main(String[] args){
        myMethod(new Object());//Compile error
    }
    static void method(String s){...}// compile error
    static void myMethod(Number n){...}

}
  1. インターフェイスで静的メソッドを定義できないのはなぜですか?
  2. method()static修飾子で実装できないのはなぜですか?
  3. Object を参照して myMethod を呼び出すと、コンパイル エラーが発生します。私が理解しているように、コンパイラは自動的にキャストしませんよね?
  4. 次のコードを検討してください

    Object someObj; ... Number n= (Number) someObj;

Numberこの場合、キャストするときにコンパイラは何をしているでしょうか?

4

3 に答える 3

4

インターフェイスで静的メソッドを定義できないのはなぜですか?

インターフェイスのすべてのメソッドは、デフォルトでpublic abstract. 修飾子を使用staticしても意味がありません。静的メソッドの呼び出しは多態的ではないためです。その意味では、それらをオーバーライドすることはできません。クラス名のみで静的メソッドを呼び出します。まあ、いくつかの参照でもそれらを呼び出すことができますが、それは参照の宣言された型に基づいて最終的に解決されます。メソッドはデフォルトで抽象化されているため、呼び出しても意味がありません。タスクを実行するためのボディはありません。

method() を static 修飾子で実装できないのはなぜですか?

オーバーライドされたメソッドに修飾子を追加しようstaticとしても、オーバーライドしているとは見なされません。したがって、クラスには基本的に、同じ名前、同じパラメーター、同じ戻り値の型を持つ 2 つの異なるメソッドがあります。もちろん、それはクラス内では許可されていません。

クラスのオーバーライド メソッドに修飾子を明示的に追加する必要があることに注意してpublicください。そうしないと、コードがコンパイルされません。その理由は、サブクラスでオーバーライドされたメソッドの可視性を低下させることはできません。

Object を参照して myMethod を呼び出すと、コンパイル エラーが発生します。私が理解しているように、コンパイラは自動的にキャストしませんよね?

Jave は自動縮小変換を行いません。キャストを明示的に追加する必要があります。しかし、許可されたとしても、サブクラス参照でスーパークラス オブジェクトを参照しようとしているために、コードがどのように動作すると予想されるでしょうか? もちろん、メソッドの呼び出し中にキャストを追加することで、コードをコンパイルすることができます。

myMethod((Number)new Object());  // This will compile, but fail at runtime

上記の呼び出しはClassCastException、実行時の結果になります。

ただし、Objectのサブクラスのオブジェクトを参照する参照がある場合Numberは、明示的なキャストを追加できます。これはタイプ セーフになります。

Object obj = new Integer(5);
Number num = (Number)obj;  // This is fine. Because `obj` is referring to an `Integer`.

最後に、mainメソッドの署名が正しくありません。public修飾子がありません。

于 2013-09-27T16:11:10.350 に答える
2

インターフェイスで静的メソッドを定義できないのはなぜですか?

インターフェイスは、基本的にポリモーフィズムで動作するように設計されています。ポリモーフィズム インターフェイスで静的メソッドを呼び出すときに、どの実装を呼び出すべきかをどのように知るのでしょうか?

// Should that invoke MyClass.method or MyOtherImplementation.method?
MyInterface.method("foo");

次:

method() を static 修飾子で実装できないのはなぜですか?

アイデアは、インターフェイスを実装するオブジェクトでメソッドが呼び出されることです-これにより、インスタンスメソッドになります。

Object を参照して myMethod を呼び出すと、コンパイル エラーが発生します。私が理解しているように、コンパイラは自動的にキャストしませんよね?

いいえ、コンパイラは自動的にキャストしません。Objectからへの暗黙的な変換はないため、 typeの引数を持つNumbertype のパラメーターを持つメソッドを呼び出すことはできません。NumberObject

この場合、Number にキャストするとき、コンパイラは何をしているのでしょうか?

someObjの値がnull であるか、インスタンスNumberまたはサブクラスへの参照であることを検証しています。

于 2013-09-27T16:08:50.817 に答える
0

JDK7まで:

  1. 静的メソッドはクラスにバインドされているためです。通常は次のように呼び出します。

    MyClass.method("");
    

    それらを上書きすることはできません。

  2. 1 を参照してください。すべてのインターフェイス メソッドはpublic abstract変更できません。

  3. いいえ、コンパイラは自動的にキャストしません

  4. 彼はキャストしようとして失敗する

于 2013-09-27T16:09:34.037 に答える