3

TestClass.main() を実行すると 202 202 101 が出力されるのはなぜですか??

class BaseClass
{
    int data = 101;
    public void print()
    {
        System.out.print(data + " ");
    }
    public void fun()
    {
        print();
    }
}
class SubClass extends BaseClass
{
    int data = 202;
    public void print()
    {
        System.out.print(data + " ");
    }
}
class TestClass
{
    public static void main(String[] args)
    {
        BaseClass obj = new SubClass();
        obj.print();
        obj.fun();
        System.out.print(obj.data);
    }
}

OOP の知識が乏しいので、実行は次のようにする必要があると思います。

1- obj.print(); SubClass から 202 を出力します

2- obj.fun(); がないため サブクラスのメソッドは親メソッドを呼び出すため、出力は101になるはずです

3- System.out.print(obj.data); 値はサブクラスでオーバーライドされるため、202 を出力する必要があります。

出力は 202 101 202 になると思いますが、そうではありません。理由を説明していただけますか?

4

4 に答える 4

4

obj.fun(); がないので サブクラスのメソッドは親メソッドを呼び出すため、出力は101になるはずです

実際、これは のスーパー クラスを呼び出しますfunが、スーパー クラスは を呼び出しprintprintオーバーライドされると、(サブクラス内の) オーバーライド バージョンが呼び出されます。

System.out.print(obj.data); 値はサブクラスで上書きされるため、202 を出力する必要があります。

変数はオーバーライドされませんが、サブクラスによって隠され、 としてobj宣言されているため、そのプロパティに直接BaseClassアクセスします。dataメソッド呼び出しとは異なり、これはコンパイル時に決定されます。

于 2012-05-14T04:42:00.837 に答える
2

メソッドは多態的であり、フィールドはそうではないため

削除すると

int data = 101;

あなたからBaseClassそれはコンパイルされません

于 2012-05-14T04:40:40.223 に答える
1

秘訣は、実行するメソッドを決定することです。その選択は、オブジェクトのインスタンスの型から行われます。あなたの場合、 obj は でSubClassあり、 を呼び出すたびにprint()の print メソッドが実行されますSubClass。このメカニズムはOOP ではポリモーフィズムと呼ばれます。

メソッドと変数を混在させるのではなく、メソッドのみをテストすることから始めることをお勧めします。コードはほとんど同じで、ポリモーフィズムの動作も同じですが、変数はありません。

class BaseClass
{
    public void print()
    {
        System.out.print(101 + " ");
    }
    public void fun()
    {
        print();
    }
}
class SubClass extends BaseClass
{
    public void print()
    {
        System.out.print(202 + " ");
    }
}
class TestClass
{
    public static void main(String[] args)
    {
        BaseClass obj = new SubClass();
        obj.print();
        obj.fun();
    }
}
于 2012-05-14T04:45:58.527 に答える
0

1 と 2 - メソッドは多態的です - メソッド from はメソッド from使用base classします。sub classsub class

3 - フィールドは多態的ではありません。参照の型から取得されます。

于 2012-05-14T04:43:59.217 に答える