2017-02-02 7 views
0

私はクラスConstructorOwのクラスConstructorTwoを継承していますが、オブジェクトを作成していません(明示的には少なくとも明示的に)。では、なぜConstructorTwoクラスのコンストラクタはpublicでなければなりませんか?Javaがデフォルトのコンストラクタを使用してpublicクラスを継承しています

このエラーが発生します。ConstructorTwo()がConstructorTwoでパブリックではありません。 Javaは任意のコンストラクタを呼び出したときに、それはそれは、サブクラスのコンストラクタでのコードのいずれかを呼び出す前に、スーパークラスのコンストラクタを呼び出す必要があるため、それは公共のでなければならない理由がある

package one; 

import two.ConstructorTwo; 

public class ConstructorOne extends ConstructorTwo { 

    public static void main(String args[]) { 

    } 
} 


package two; 

public class ConstructorTwo { 

    ConstructorTwo() { 
     super(); 
     System.out.println("Default constructor in package TWO!"); 
    } 
} 
+1

コンパイルエラーが発生していると思われますか?あなたの質問にそれを含める価値はおそらくあります。 – khelwood

+0

@khelwoodが含まれています。 –

+0

エラーは自明ですが 'パッケージ外からはアクセスできません '。 [Javaのアクセス修飾子](https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html) – Guy

答えて

2

パッケージ外からアクセスすることはできません。 Javaがプライバシー・エラーのためにスーパークラス・コンストラクターにアクセスできない場合、コンストラクターを呼び出すために必要な操作であるスーパークラス・コンストラクターは実行できません(Javaに準拠)。これが公開でなければならない理由です。

+0

Constructor2は、同じパッケージ内のクラスから呼び出すことができます(例:two.MyMainはConstructorTwo()を呼び出すことができます)。コンストラクタを呼び出すと、コンストラクタが呼び出されます。 – John

+0

ConstructorOneクラスのオブジェクトを作成していないときに、Javaが最初の場所でConstructorOneクラスのコンストラクタを呼び出すのはなぜですか? –

+0

これはJavaの作り方です。それは私のせいではありません。それについて考える。 JFrameを拡張しているとします。コンストラクターが呼び出されない場合は、いくつかの重要な初期化プロセスが発生しない可能性があります。だからそれを呼び出さなければならないのです。 – Leonid

1

クラスConstructorOneのデフォルトのコンストラクタは、ConstructorTwoのデフォルトのコンストラクタである​​を呼び出します。メソッドやコンストラクタを呼び出すときや、パッケージの境界を越えてフィールドにアクセスするときは、パブリックにする必要があります。

+0

最初の 'ConstructorTwo'は' ConstructorOne'を読みます。 –

+0

@CarlosHeubergerありがとうございました。私は間違いを修正した。 –

0

ConstructorOneクラスには、引数を取らず自動的に生成されるpublicコンストラクタがあり、super()を呼び出します。実際には、次のようになります。

public ConstructorOne() { 
    super(); 
} 

コンストラクタを自分で記述しないと、すべてのクラスが暗黙的にそのようなコンストラクタを持ちます。したがって、スーパークラスを呼び出すために利用可能なコンストラクタが必要です(この場合は、別のパッケージのサブクラスによってアクセスできるようにpublicまたはprotectedのいずれかでなければなりません)。

+0

私はそれを理解しますが、なぜそれはまったく呼び出されますか?私はクラスConstructorOneのオブジェクトを全く作成していないし、静的なmain()メソッドを呼び出すオブジェクトを作成すべきではないことが分かっている限り、 –

+0

あなたが起動していなければ問題ありません。効果的にそこにあるので、ルールに従わなければなりません。呼び出されていないメソッドのコードの問題は、引き続きコンパイルの問題を引き起こす可能性があります。 – khelwood

+0

あなたはそれを呼び出すのではなく、いつもそうなるかどうかをコンパイラが知っておくべきでしょうか。これはライブラリでも、どこか別の場所で使用されるかもしれません。 –

0

コンストラクタをパブリックにすると、誰でもそれを呼び出すことができます。コンストラクタがプライベートである場合、通常、オブジェクトを他の方法で構築する必要があります。通常、その目的のために作成者が作成した別の静的静的メソッドを使用します。

関連する問題