2009-08-28 6 views
12

私はこのコードに2つの質問があります。混乱している "プライベートメソッドを上書きする"

public class Override { 
    private void f() { 
     System.out.println("private f()"); 
    } 
    public static void main(String[] args) { 
     Override po = new Derived(); 
     po.f(); 
    } 
} 

class Derived extends Override { 
    public void f() { 
     System.out.println("public f()"); 
    } 
} 

/* 
* Output: private f() 
*/// :~ 

1)関数fはオーバーライドpoの参照でどのように見えますか?

2)なぜ "private f()"の出力ですか?

+0

しかし、サブクラスのオブジェクトを持つ参照は、スーパークラスのプライベートメソッドをどのように呼び出すことができますか?これはバグですか? –

+0

いいえ、これはバグではありません。これは動作するはずです。 – Jesper

+0

これは継承と遅延バインディングのルールに違反していません –

答えて

24
  1. mainメソッドは、クラスOverride内側です。あなたはがクラスDerived方法fをオーバーライドしていない

  2. は、何の多型はありません。変数poのタイプはOverrideなので、Overrideクラスのメソッドfが使用されます。

クラスOverrideにおける方法fが全くクラスDerivedに表示されないことに留意されたいです。クラスDerivedfメソッドは、スーパークラスのメソッドfとは関係のない別のメソッドです。

+0

しかし、バインディングが実行時に行われると、poはDerivedクラスのオブジェクトを持ち、そのスーパークラスのプライベートメソッドをどのように呼び出すことができます。 –

+3

あなたのコードのどこにも、スーパークラスのプライベートメソッドへの呼び出しがあります。 po.f()を呼び出すと、poのコンパイル時の型がOverrideなので、Overrideのfが呼び出されます。オーバーライドがないため、動的バインディング(多態性なし)はありません。Javaは実行時に型を調べません。 – Jesper

2
Override po = new Derived(); 
po.f(); 

あなたはスコープの規則に従って、クラスのprivateメンバーが最初に考慮されるため、オブジェクトが派生されている場合でもオーバーライド独自のメソッドにアクセスしている、そしてそのオーバーライドの範囲で記述されたとして、それはプライベートFを参照している、とそのプライベートはDerivedクラスでオーバーライドされていないため、メソッドのシグネチャが同じである場合にのみオーバーライドされます。

Derived po = new Derived(); 
po.f(); 

Thsiはメソッドのオーバーライドが3つのconditions.childクラス必見は、同じ名前とパラメータを持ってい

+0

質問はC#ではなくJavaについてです。 'virtual'はJavaでは存在しません。 – Jesper

+0

コメントをいただき、ありがとうございました。 –

0

の派生Fを呼び出し、両方の場合はそのスーパーclass.Butとして値を返します正しいコードであります!オーバーライドが存在しないように、パラメータと返される値は、2つの方法が異なる方法であっても、異なっている[OK]を次のように:!!

public class Parent { 
      public int addV(int a,int b){ 
     int s; 
     s = a + b; 
     return s; 
    } 
} 

class Child extends Parent{ 
    public void addV(){ 
     //do...something 
    } 
} 

Eclipseのエラーを話すことはありません!これは、クラスChildのメソッドaddVが、クラスParentのaddVメソッドと異なるためです。インスタンスとして!

+0

メソッドの名前とargsのリストだけがまったく同じでなければなりません。子の戻り値は、親の戻り値のサブクラスになる可能性があります。省略したルールは2つあります。子のメソッドは、少なくとも親のメソッドと同じくらいアクセス可能でなければなりません。また、サブクラスは新しいチェック例外またはそれよりも広い例外をスローすることはできません。 – pkkoniec