私はJavaを学んでおり、最終的に継承に到達しました。私が読んでいるこの本では、メソッド/変数に "public"アクセス修飾子を付ける必要はないということを学びました。コンストラクタを使用してアクセス修飾子を使用しない場合の結果が異なります
B.javaA.java
package Default;
class A extends B {
A() { System.out.println("A constructor initiated"); }
public static void main(String ... args) {
A obj = new A();
}
}
:
int showDim() { ... }; // both are the same because by default public int showDim() { ... }; // not adding an access modifier will make it public.
だからコンストラクタと継承の対象にはほとんどレビューのために、私は、この小さなプログラムを作成しましたpackage Default;
class B {
B() { System.out.println("B constructor initiated"); }
}
クラスAメインメソッドを実行すると、結果は次のようになります。
A constructor initiated
Aコンストラクターだけが実行されます。しかし、私がAとBの両方のコンストラクタの前でpublicに先行すると、これが結果になります。
B constructor initiated
A constructor initiated
どうしてですか?アクセス修飾子を追加しないと、デフォルトでは公開されると思いました。これにはどんな理由がありますか?私が理論化できるのは、メインのメソッドがAクラスの内部から実行されているからです。
アクセス修飾子に関係なく、スーパークラスのコンストラクタは常に実行されます。コードがコンパイルされると、これを防ぐ方法はありません。 –
@PeterLawrey 'public'または 'protected' super()コンストラクタが存在する場合はそれを呼び出します。それ以外の場合は、空のものが作成されます。それで、最初のケースで印刷された1つのステートメントだけが得られます。 –
@IvanValerianiコンストラクタが存在しない場合にのみデフォルトのコンストラクタを作成します。 'B()'がデフォルトで呼び出す 'super()'コンストラクタがなければ、コードはコンパイルされません。この場合、修飾子にかかわらず空のものは作成されません。 –