13

このコードについて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)「privatef()」が出力されるのはなぜですか

4

3 に答える 3

24
  1. mainメソッドはクラス内にあるので、もちろんクラスのOverrideプライベートメンバーを見ることができますOverride

  2. クラスのメソッドをオーバーライドしていません。ポリモーフィズムはありません。変数の型はであるため、クラスからメソッドを取得します。fDerivedpoOverridefOverride

fクラスのメソッドはクラスOverrideではまったく表示されないことに注意してくださいDerivedfクラスのメソッドDerivedは別のメソッドであり、スーパークラスのメソッドとは何の関係もありませんf

于 2009-08-28T10:40:35.430 に答える
2
Override po = new Derived();
po.f();

オブジェクトが派生している場合でも、オーバーライド自体のメソッドにアクセスしています。これは、スコープルールに従って、クラスのプライベートメンバーが最初に考慮され、オーバーライドのスコープに記述されているため、プライベートfを参照しているため、プライベートであるため、オーバーライドされません。派生クラスは、メソッドのシグネチャが同じ場合にのみオーバーライドされます。

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

Thsiは、Derivedのfを呼び出す正しいコードです。

于 2009-08-28T10:49:45.537 に答える
0

メソッドのオーバーライドには3つの条件があります.childクラスはそのスーパークラスと同じ名前とパラメーターおよび戻り値を持っている必要がありますが、パラメーターと戻り値の両方が異なる場合、オーバーライドは存在しません!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とは異なるためです。インスタンスとして!

于 2009-08-28T12:54:27.560 に答える