178

これは、サブクラスのコンストラクターに入れないと、コンパイラーによって自動的に入れられませんか?

それは私がそれを気にする必要さえないことを意味しますか?いくつかの記事で彼らはそれを出しました。

また、引数付きのコンストラクターが1つある場合、これはコンストラクターになりますか、それとも引数リストのないコンストラクターを使用しますか?

4

6 に答える 6

253

まず、いくつかの用語:

  • No-argsコンストラクター:パラメーターのないコンストラクター。
  • アクセス可能な引数なしコンストラクター:サブクラスに表示されるスーパークラス内の引数なしコンストラクター。これは、パブリックまたは保護されているか、両方のクラスが同じパッケージにある場合はパッケージアクセスであることを意味します。と
  • デフォルトコンストラクター:クラスに明示的なコンストラクターがない場合にコンパイラーによって追加されるパブリックno-argsコンストラクター。

したがって、すべてのクラスには少なくとも1つのコンストラクターがあります。

サブクラスコンストラクターは、サブクラスのコンストラクターでコードを実行する前に、スーパークラスのどのコンストラクターを呼び出すかを最初に指定する場合があります。

サブクラスコンストラクターが呼び出すスーパークラスコンストラクターを指定しない場合、コンパイラーはスーパークラス内のアクセス可能な引数なしコンストラクターを自動的に呼び出します。

スーパークラスに引数なしのコンストラクターがない場合、またはアクセスできない場合は、(サブクラスコンストラクターで)呼び出されるスーパークラスコンストラクターを指定しないとコンパイラエラーになるため、指定する必要があります。

例えば:

public class Base { }
public class Derived extends Base { }

コンストラクターを明示的に追加しない場合、Javaはパブリックデフォルトコンストラクターを自動的に配置するため、これは問題ありません。

public class Base { }
public class Derived extends Base { public Derived(int i) { } }

また大丈夫です。

public class Base { public Base(String s) { } }
public class Derived extends Base { }

Baseにはデフォルトのコンストラクタがないため、上記はコンパイルエラーです。

public class Base { private Base() { } }
public class Derived extends Base { }

Baseのno-argsコンストラクターはプライベートであるため、これもエラーです。

于 2010-01-13T02:48:01.563 に答える
59

スーパークラスコンストラクタに引数がない場合、Javaは自動的にそれを呼び出します。引数がある場合はエラーになります。

src: http: //java.sun.com/docs/books/tutorial/java/IandI/super.html

于 2010-01-13T02:47:34.963 に答える
26

引数なしのスーパーコンストラクターを呼び出すことは、画面スペースとプログラマーの時間の無駄です。コンパイラは、記述したかどうかに関係なく、まったく同じコードを生成します。

class Explicit() {
    Explicit() {
        super();
    }
}

class Implicit {
    Implicit() {
    }
}

更新(2018年12月):

明示的なsuper()記述は、IDEでソースコードをナビゲートするのに役立ちます。

2018年12月の時点で、EclipseもIntelliJも、派生クラスのコンストラクターから基本クラスのコンストラクターに快適に移動する手段を提供していません。

于 2016-12-11T10:46:11.903 に答える
8

デフォルトの親コンストラクターは、呼び出さなくても子のデフォルトコンストラクターから呼び出されます。

主要

public class Main {

    public static void main(String[] args) {
        A a = new B();
    }
}

A

public class A {

    public A() {
        System.out.println("A");
    }
}

B

public class B extends A {

    public B() {
        System.out.println("B");
    }
}

プリント

A
B
于 2017-06-29T12:21:35.683 に答える
1

明示的に呼び出されたsuper([arguments])がない場合、クラスコンストラクターは常に「super()」を呼び出します。プログラミング中にスーパークラスコンストラクターにアクセスすることを念頭に置いてください...特定のクラスを拡張しない場合、automatic extends java.lang .Objectクラス

于 2017-02-16T04:36:10.343 に答える
-2
abstract class Book
 {
String title;
String author;
Book(String t,String a){
    title=t;
    author=a;
}
abstract void display();

}    

スーパークラスが引数なしのコンストラクターを持つことができる場合。引数なしのコンストラクターを持つことは良いことです。そうでない場合は、パラメーターを指定してスーパーコンストラクターを渡す必要があります。

スーパークラスに引数なしのコンストラクターがない場合、またはアクセスできない場合は、(サブクラスコンストラクターで)呼び出されるスーパークラスコンストラクターを指定しないとコンパイラエラーになるため、指定する必要があります

class MyBook extends Book{   
int price ;
public  MyBook(String t,String a,int price){
     super(t,a);
    this.price=price;
}

public void display(){
    System.out.println("Title: "+title);
 System.out.println("Author: "+author); 
System.out.println("Price: "+price);

}

}

于 2016-01-14T17:50:19.597 に答える