6

基本的に、インスタンスメソッドによって静的メソッドをシャドウできない理由を知りたいのですが(理由はわかっていますが、特定の状況ではあいまいさにつながります)、静的変数はインスタンス変数によってシャドウすることができます(サブクラスにのみ適用されます) )。

例:

public class Apartment{

    static int area = 10;

    public static int getArea(){
        return area;
    }
}

class BedroomFlat extends Apartment {

    int area = 10;// no problem at all 

    public int getArea(){ // illegal line it cannot hide the super static method
        return area;
    }
}

したがって、スーパークラスでint area(インスタンス変数)を宣言しようとすると、エラーが発生しますが、サブクラスからまだ可視でstatic int areaあっても、サブクラスで宣言するとエラーは発生しません。static int area

インスタンスメソッドで静的メソッドをシャドウイングしようとすることと、インスタンス変数で静的変数をシャドウイングしようとすることの動作の違いは何ですか。

前もって感謝します。

4

6 に答える 6

2

クラスに属しているため、静的メソッドとフィールドを継承することはできません。

親からオーバーライドしていない場合getArea();、同じ署名でメソッドを作成しようとしています-コンパイルエラーが発生します。

于 2013-03-10T08:45:56.840 に答える
1

メソッドのオーバーライドはインスタンス メソッドにのみ適用されるため、サブクラス (BedroomFlat) では、コンパイラは基本クラスの静的メソッドと同じ名前のインスタンス メソッドを宣言することを許可しません。クラスを拡張すると、インスタンス メソッドがサブクラスでオーバーライドできるようになります (クラス メソッド、つまり static ではありません)。さらに、静的メソッドの署名と同じ署名を持つメソッドを宣言しようとすると、インスタンス メソッドに対してオーバーライドが行われるため、コンパイラは静的メソッドをオーバーライドできないというエラーをスローします。

ただし、変数はオーバーライドの候補ではないため、コンパイラーは、スーパークラスの静的変数と同じ名前のインスタンス変数を宣言することを停止しません。

于 2013-03-10T09:42:17.050 に答える
0

Javaでは、静的メソッドとフィールドはクラスにのみ属しているため、オブジェクトに継承できません。そうしないと、コンパイルエラーが発生します。

于 2013-03-10T08:57:44.590 に答える
0

問題は、あなたはここで何も影を落としていないということです...

あなたのインスタンス変数は私が名前を付けて直接アクセスでき、通常、静的変数にアクセスするには ClassName.staticVar のようなものを書く必要があります。Java では、静的変数を参照する場合にのみクラス名を省略できます。

それは明らかですよね?

于 2013-03-10T08:53:28.203 に答える
0

子が親を継承することはわかっていますが、静的メソッドをオーバーライドできないこともわかっています。したがって、この場合、子には同じメソッド シグネチャを持つ 2 つのメソッドがあります。Java は同じ署名の 2 つのメソッドをサポートしていないため、問題が発生しますが、ここでは 1 つのメソッドが静的で、別のメソッドが非静的です。しかし、静的変数の場合はそうではありません。

于 2013-03-10T09:21:23.420 に答える