これは、サブクラスのコンストラクターに入れないと、コンパイラーによって自動的に入れられませんか?
それは私がそれを気にする必要さえないことを意味しますか?いくつかの記事で彼らはそれを出しました。
また、引数付きのコンストラクターが1つある場合、これはコンストラクターになりますか、それとも引数リストのないコンストラクターを使用しますか?
これは、サブクラスのコンストラクターに入れないと、コンパイラーによって自動的に入れられませんか?
それは私がそれを気にする必要さえないことを意味しますか?いくつかの記事で彼らはそれを出しました。
また、引数付きのコンストラクターが1つある場合、これはコンストラクターになりますか、それとも引数リストのないコンストラクターを使用しますか?
まず、いくつかの用語:
したがって、すべてのクラスには少なくとも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コンストラクターはプライベートであるため、これもエラーです。
スーパークラスコンストラクタに引数がない場合、Javaは自動的にそれを呼び出します。引数がある場合はエラーになります。
src: http: //java.sun.com/docs/books/tutorial/java/IandI/super.html
引数なしのスーパーコンストラクターを呼び出すことは、画面スペースとプログラマーの時間の無駄です。コンパイラは、記述したかどうかに関係なく、まったく同じコードを生成します。
class Explicit() {
Explicit() {
super();
}
}
class Implicit {
Implicit() {
}
}
更新(2018年12月):
明示的なsuper()
記述は、IDEでソースコードをナビゲートするのに役立ちます。
2018年12月の時点で、EclipseもIntelliJも、派生クラスのコンストラクターから基本クラスのコンストラクターに快適に移動する手段を提供していません。
デフォルトの親コンストラクターは、呼び出さなくても子のデフォルトコンストラクターから呼び出されます。
主要
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
明示的に呼び出されたsuper([arguments])がない場合、クラスコンストラクターは常に「super()」を呼び出します。プログラミング中にスーパークラスコンストラクターにアクセスすることを念頭に置いてください...特定のクラスを拡張しない場合、automatic extends java.lang .Objectクラス
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);
}
}