19

以下では、2 つのクラスがあります。親と子。Child クラスは Parent クラスを継承しています。Parent クラスのコンストラクターでは、Parent クラスの print() メソッドを呼び出しています。

main() メソッドで子クラスのオブジェクトを作成すると、親クラスのコンストラクターが実行され、親クラスの print() メソッドの代わりに子クラスの print() メソッドが呼び出されます。

Q1. なぜこれが起こるのか。

Q2. i の値が 0 である理由

public class Sample
{
    public static void main(String[] args) 
    {
        Child objChild = new Child();
        objChild.print();
    }
}

class Parent
{   
    void print()
    {
        System.out.println("i Value");
    }

    Parent()
    {
        print();
    }
}    

class Child extends Parent
{
    int i = 45;

    void print()
    {
        System.out.println("i Value = "+i);
    }
}

OP

i Value = 0
i Value = 45
4

6 に答える 6

4

Java初心者:私はあなたの問題を手に入れました.. 1.その時点で子クラスのオブジェクトを作成すると、親クラスのコンストラクターが最初にbcozを呼び出したにもかかわらず、親クラスではなく子クラスでのみ呼び出されるprint()メソッドオブジェクトは子クラスのものです次の例を参照してください。

public class Test
    {
        public static void main(String[] args) 
        {
            //create the object of child class
            Child child = new Child();
        }
    }

    class Parent
    {   
        void print()
        {
            System.out.println("parent>> i ValueOne=");
        }

        Parent()
        {
            System.out.println("parent>> i ValueTwo=");
            print();
        }
    }    

    class Child extends Parent
    {
        int i = 45;


        void print()
        {
            System.out.println("Child>>i Value = "+i);
        }
    }

出力:

parent>> i ValueTwo=
Child>>i Value = 0

2.その時点で親クラスのオブジェクトを作成すると、親クラスのprint()メソッドが呼び出されます。次の例を参照してください。

public class Test
    {
        public static void main(String[] args) 
        {
            //create the object of Parent class
            Parent parent = new Parent();
        }
    }

    class Parent
    {   
        void print()
        {
            System.out.println("parent>> i ValueOne=");
        }

        Parent()
        {
            System.out.println("parent>> i ValueTwo=");
            print();
        }
    }    

    class Child extends Parent
    {
        int i = 45;


        void print()
        {
            System.out.println("Child>>i Value = "+i);
        }
    }

出力:

parent>> i ValueTwo=
parent>> i ValueOne=

3.そして、i の値が 0 または 45 である理由はすでにクリアされていると思います。

于 2013-04-24T06:01:13.007 に答える
2

まず、Childクラスにコンストラクターの定義がありません。

Childクラスのコンストラクターを定義しない場合、そのデフォルトのコンストラクターは次のとおりです。

public Child() {
    super();
}

クラスコンストラクター(スーパークラスコンストラクター)super();を呼び出す場所。Parent

print()ただし、クラスでメソッドを定義し、クラスのメソッドChildと同じシグネチャ (名前 + パラメータ) を持っているため、同じシグネチャParentでスーパー クラス メソッドをオーバーライドします。

そのため、ChildクラスはParent独自のprint()メソッドを呼び出しながら、クラス コンストラクターを呼び出します。

-追加した:

iクラスで int 変数を初期化していないため、最初の i 値は 0Parentであり、初期化されていない int 変数の値はデフォルトで 0 です。Parentが呼び出された後、 nowChildprint()メソッドを呼び出し、クラスでi初期化されるため、 nowは初期化した値ですChildi

于 2013-04-24T05:22:30.327 に答える
2

その時点で print メソッドへの最初の呼び出しiは 45 に初期化されていないため、その印刷 0.
呼び出しは次のようになります

  • 子コンストラクター (子から親へのコンストラクター チェーンのため)
  • 親コンストラクター
  • print メソッド (ここiでは初期化されていないため、子コンストラクターがまだ完成していないため、デフォルト値iは 0 です)
  • 親コンストラクターが完了した後、子コンストラクターiは45の値を取得します-
  • そのため、次の print メソッドの呼び出しで 45 が出力されます
于 2013-04-24T05:17:41.423 に答える