2016-05-10 10 views
-1
public class Base { 
    private static boolean goo = true; 
    protected static boolean foo() { 
      goo = !goo; 
      return goo; 
    } 

    public String bar = "Base:" + foo(); 

    public static void main(String[] args) { 
     Base base = new Sub(); 
     System.out.println("Base:"+ base.foo()); 
    } 
} 

public class Sub extends Base { 
    public String bar = "Sub:" + foo(); 
    protected static boolean foo() { 
     return false; 
    } 
} 

出力が「ベース:true」の理由は? foo()は、動的な型がSubであるようなオーバーライド方法のようですが、戻り値の出力が "false"でない理由、Baseのフィールドにも文字列があります。動的バインディング、オーバーライド

+6

静的メソッドはオーバーライドされず、オブジェクトではなくクラスにバインドされます – mangusta

+0

この文でgoo値が変更されました。 "public String bar =" Base: "+ foo();"以前は印刷していたので、それが "Base:true"という出力の理由です – RubioRic

+0

Baseのfoo()は実行されましたか? – student

答えて

0

メソッドまたは変数に関して「静的」という言葉を扱うときは、メソッドまたは変数がそのオブジェクトではなく「クラス」に属していることを示します。

オブジェクトがない場合、オーバーライドはありません。

クラスベースでは、次の文を記述したmain()メソッドを宣言しました。今

Base base = new Sub(); 
System.out.println("Base:"+ base.foo()); 

、参照変数の型は、ベースであり、オブジェクトタイプは、サブあります。 のfoo()ので、基準変数(すなわちベース)宣言されたクラスに属する静的メソッドです。 したがって、FOOが呼び出されるクラス塩基方法。

1

Javaでは、静的メソッドをオーバーライドすることはできません。サブクラスでその静的メソッドを定義し直すと、オーバーライドされずにメソッドが上書きされます(メソッド隠蔽)。

あなたの例では、スーパークラスのメソッドがサブクラスのメソッドだけを呼び出さないように、スーパークラスのref(base)を使ってスーパークラスのメソッドを呼び出すようにしています。出力は「Base:true」

非静的メソッドで変更すると、サブクラスメソッドが実行されます。

ここでのルールは次のとおりです。スーパークラスrefクラスとサブクラスオブジェクトは、非静的メソッドに対して機能します。

+0

しかし、なぜ "真"、ベースのfoo()は、偽にgoo値をチャンスに見える、ないのですか? – student

+0

説明..回答を見る – Shubhi224

+0

javaでは、静的メソッドfoo()が2回実行されます(最初は静的な順序に基づいてメインメソッドの前に実行されます)。 –

0

メソッドのオーバーライドは、サブクラスのオブジェクトの動作をオーバーライドするために使用され、静的メソッドには適用されません。静的メソッドに対してこの機能をサポートする理由はありません。さらに、静的メソッドにアクセスするためのオブジェクトを作成する必要はありません。名前[foo()]で参照するか、接頭辞としてclassnameを使用するだけです(例:Sub.foo())。グーがAであることからのfoo()メソッド

public String bar = "Base:" + foo();

を呼び出す

限り、なぜ真の出力に返されるように関係しているあなたはすでにあなたのクラスでの文の下に使用していたので、これは、静的変数の場合、この変数のインスタンスはこのクラスに対して1つだけ維持されます。上記の文を実行すると、gooの値がfalseに変わります(goo=!goo、gooは最初は真です)。もしbase.foo()を使用するときに再びそれが真製造グーの値を戻した[静的メソッドと基本クラスの参照のために適用できないオーバーライドメソッドが使用されているように]その後、ベースクラスのfooは()を実行する

関連する問題