1

質問が 2 つあり
ます。

メソッドの引数はメソッドのオーバーライドで何らかの役割を果たしますか?

なぜ静的メソッドはコンパイル時にバインドすると言いますが、実際には静的メソッドはクラスの読み込み時にメモリを割り当てますか? javacツールを使用すると、コンパイラを使用してJavaファイルをコンパイルするため、その瞬間に静的メモリが割り当てられず、静的メモリがクラスのロード時間を割り当てます。なぜ静的メソッドがコンパイル時のバインディングを使用すると言うのですか

クラスのロード時間はコンパイル時間と同じですか? 私は混乱しています

私はここでメソッドの署名が異なることを知っているので、ここで実際に起こることよりもここでオーバーライドしないでください

class A
    {
        void sh(char x){
        System.out.println("value of x :  "+x);
        }
    }
    class B extends A
    {
        public void sh(int x)
        {
            System.out.println("value of x"+x);
        }
    }
    class C
    {
        public static void main(String...Aa) /* ??? */
        {
            A a1=new B();
            //a1.show();
            a1.sh('a');
            a1.sh(10);
        }
    } 
4

2 に答える 2

4

Java言語仕様の状態

クラス C で宣言されたインスタンス メソッド m1 は、次のすべてが当てはまる場合、クラス A で宣言された別のインスタンス メソッド m2 をオーバーライドします。

  • C は A のサブクラスです。

  • m1 の署名は、m2 の署名のサブ署名 (§8.4.2) です。

  • また:

    • m2 が public、protected、または C と同じパッケージでデフォルト アクセスで宣言されている、または

    • m1 は、m3 が m2 をオーバーライドするように、メソッド m3 (m1 とは異なる m3、m2 とは異なる m3) をオーバーライドします。

  • さらに、m1 が抽象でない場合、m1 は、オーバーライドする抽象メソッドのすべての宣言を実装すると言われます。

の定義subsignatureはこちらです。あなたが尋ねる

メソッドの引数はメソッドのオーバーライドで何らかの役割を果たしますか?

上記によると、はい、非常にそうです。署名は一致する必要があります。言い換えると

public void sh(int x)

オーバーライドしていません

void sh(char x){

なぜ静的メソッドはコンパイル時にバインドすると言いますが、実際には静的メソッドはクラスの読み込み時にメモリを割り当てますか?

コンパイル時に、メソッド呼び出しは参照の静的または宣言された型で解決されます。つまり、型がそのようなメソッドを宣言していない場合、プログラムはコンパイルされません。staticメソッド用。メソッドが の場合、staticメソッドはすぐに解決され、呼び出された型にバインドされます。メソッドの場合instance、バインディングはポリモーフィズムで動的に解決 (レイト バインディング) されます。

これは、クラスのロードやメモリの割り当てとは関係ありません。

于 2013-09-27T19:49:34.487 に答える