1

次のようにscjpガイドを読みました

実際、オブジェクトの実際のクラス型のコンストラクターだけでなく、その各スーパークラスのコンストラクターも呼び出さずに新しいオブジェクトを作成することはできません!

例えば

public class Person{

}

public class Employee extends Person{
   public Employee(){
}
}

Person インスタンスは作成しませんが、合法です。

私のために説明してください、あなたの助けに感謝します。

4

6 に答える 6

1

Parentまず、子クラス ( ) をインスタンス化するために親インスタンス ( ) を作成する必要はありませんEmployee。あなたは間違った理解をしているに違いない。

親クラスのコンストラクターを呼び出すことは、新しい親インスタンス オブジェクトを作成することを意味しません ( で呼び出していないnewため、新しいインスタンスは作成されません)。子インスタンスを作成しています。このためには、継承のため、最初に親のコンストラクターを呼び出す必要があります。たとえば、親クラスprivateに、コンストラクターで初期化する必要があるフィールド (private finalフィールドなど) があるとします。このフィールドは子クラスからアクセスできませんが、親クラスのコンストラクターから初期化できます。子インスタンスでこのフィールドを初期化する必要があり、唯一の方法は を呼び出すことsuper()です。

この場合Person、デフォルトで呼び出されるデフォルトのコンストラクターがあり、明示的に呼び出す必要はありません。

ただし、Personデフォルトのコンストラクターがない場合は、明示的に呼び出す必要があります。例えば:

public class Person{
    private final String name;
    public Person(final String name) {
        this.name = name;
    }
}

public class Employee extends Person {
   public Employee() {
   }
}

これはコンパイルされません。コンストラクターを明示的Employeeに呼び出すように変更する必要があります。Person例えば:

public class Employee extends Person {
   public Employee(final String name) {
      super(name);
   }
}
于 2013-07-05T10:06:48.980 に答える
1

サブクラスをインスタンス化するときはいつでも、最初にスーパークラスのコンストラクターを呼び出します。

詳細については、JSL §8.8.7を参照してください。

Person.java

public class Person {
    public Person() {
        System.out.println("Super class constructor called");
    }
}

従業員.java

public class Employee extends Person {
    public Employee() {
        System.out.println("Sub class constructor called");
    }
}

その後、Employee をインスタンス化すると、次のようになります。

Employee e = new Employee();

出力:

呼び出されたスーパークラス コンストラクター

呼び出されたサブクラス コンストラクター

于 2013-07-05T10:07:06.390 に答える
1

彼らが実際に意味することは

  • サブクラス オブジェクトを作成している場合、つまりそのコンストラクターが呼び出されると、スーパークラス コンストラクターが内部で呼び出されます。
  • これは、引数のない既定のコンストラクターにはsuper()、スーパークラス コンストラクターへの既定の呼び出しがあるためです。
  • これは、クラスまでクラス階層のように続きますObject

実際、スーパークラスに引数のないコンストラクターを記述しないと、サブクラスの宣言でコンパイラ エラーがスローされます。

public class Super {

    public Super(int num){

    }
}

public class Sub extends Super {

}

ここで、クラスSubはコンパイルされず、エラーが発生します。これは、コンパイラによって提供される ie が を暗黙的に呼び出すためImplicit super constructor Super() is undefined for default constructor、スーパー クラスに引数のないコンストラクタが見つからないためです。default no-argument constructorsuper()

  • コンパイラは、他のコンストラクタが定義されていない場合にのみ、デフォルトの引数なしコンストラクタを提供します
  • を明示的に定義Super(int num)したので、次のように引数のないコンストラクターを明示的に作成する必要があります。

      public Super(){
    
    }
    
于 2013-07-05T10:00:23.957 に答える
0

Java の奇妙な点の 1 つに遭遇しました。

コンストラクターを定義しない場合、デフォルトまたは「引数なし」のコンストラクターが暗黙的に定義されます。見えないコードのようなものです。

コンストラクター、引数を定義するか、引数を定義しない場合暗黙のデフォルト コンストラクターはなくなります。

謎をさらに複雑にするために、サブクラスのコンストラクターの最初の行は、スーパークラスのコンストラクターを呼び出す必要があります。明示的に呼び出さない場合、引数なしのコンストラクターが暗黙的に呼び出されます。

于 2013-07-05T10:44:57.843 に答える