0

JVM がスーパークラス コンストラクターを呼び出すには何が必要ですか?

public class Test1{
    public void dis()
    {
        System.out.println("In Test1");
    }
}

public class Test2 extends Test1{
    public void dis()
    {
        System.out.println("Inside test2");
        super.dis();
    }
}

インスタンスメソッドであるためdis()、コンストラクターが自動的に呼び出されるため、スーパーが親クラスオブジェクトを指していると想定しても安全ですか?

4

5 に答える 5

1

このsuperキーワードは、次の場合に役立ちます。

  • このクラスでオーバーライドされたメソッドのスーパークラスの実装を呼び出す
  • サブクラスのコンストラクターからスーパークラスのコンストラクターにアクセスする

あなたの例は、プログラムdis()のインスタンスを呼び出して印刷する必要がある最初のケースを次の順序で示しています。Test2

Inside test2 
In Test1
于 2013-07-18T18:50:35.563 に答える
1

スーパーが親クラスオブジェクトを指していると仮定しても安全ですか

superキーワードは、現在のオブジェクトの直接のスーパー クラスメンバーにアクセスするために使用されます。スーパー クラス オブジェクトを参照しません。

コンストラクターが自動的に呼び出されるので?

キーワードの役割は、super呼び出されるスーパー クラス コンストラクターに依存しません。スーパー クラス コンストラクターはsuper()、引数なしのコンストラクターまたはパラメーター化されたコンストラクターのいずれかへの呼び出しを使用して、コンストラクター チェーンを通じて常に呼び出されます。

スーパークラスコンストラクターの連鎖とスーパークラスメンバーの呼び出しの違いの1つは、「コンストラクターを連鎖している間、super()呼び出しはコンストラクターの最初のステートメントである必要がありますが、現在のメソッドの任意の時点でスーパークラスメソッドを呼び出すことができます」.

于 2013-07-18T18:50:35.900 に答える
1

キーワードsuperが「親クラス オブジェクト」を指していません。これは名前修飾子であるため、現在のオブジェクトの親クラスで定義されたメソッドを参照できます。したがって、次のようになります。

public class Test2 extends Test1{
    public void dis()
    {
        System.out.println("Inside test2");
        super.dis();
    }
}

この呼び出しsuper.dis()は、このオブジェクトdis()の親クラスで定義されたメソッドを呼び出します。という名前の他のオブジェクトのメソッドは呼び出しません。dis()super

コンストラクターでは、少し異なることが起こっています。すべてのコンストラクターは、常に親クラスのコンストラクターへの呼び出しで開始する必要があります。superこれは、キーワードを使用して明示的に行うことができます。

public class Test2 extends Test1{
    public Test2() {
        super(); // explicitly invokes parent class default constructor
        . . .
    }
}

特定の親クラス コンストラクターを明示的に呼び出さない場合、コンパイラは既定の (引数のない) 親クラス コンストラクターへの呼び出しを自動的に挿入します。親クラスのコンストラクター (存在する場合) への呼び出しは、コンストラクターの最初のステートメントである必要があります。ただし、メソッド内では、super.名前がどこで使用されていても、その名前の修飾子として使用できます (名前が親クラスのメンバーである場合)。

于 2013-07-18T18:57:25.320 に答える
0


スーパーコンストラクターを使用して、サブクラスのスーパークラスから関数と変数を直接呼び出すことができます


public class Test1{
 int a=5;
  } 
 public class Test2 extends Test1{
  int a=15;
  int c;
   c=a+super.a;
  System.out.println("value of c is:"+
  }
   result :value of c is:20
  you can call default constructor of super class by super() .
  if there is variables then you can call it by super(parameter_list).
于 2013-07-18T19:14:40.283 に答える
0

これはコンストラクタとは関係ありません。および dis() は両方のクラスで実装されているためTest2 extends Test1、サブクラスの super.dis() はスーパークラスの dis() を呼び出します。

于 2013-07-18T18:51:10.073 に答える