2016-03-25 9 views
0

私はJavaを学んでおり、最終的に継承に到達しました。私が読んでいるこの本では、メソッド/変数に "public"アクセス修飾子を付ける必要はないということを学びました。コンストラクタを使用してアクセス修飾子を使用しない場合の結果が異なります

B.java

A.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クラスの内部から実行されているからです。

+1

アクセス修飾子に関係なく、スーパークラスのコンストラクタは常に実行されます。コードがコンパイルされると、これを防ぐ方法はありません。 –

+1

@PeterLawrey 'public'または 'protected' super()コンストラクタが存在する場合はそれを呼び出します。それ以外の場合は、空のものが作成されます。それで、最初のケースで印刷された1つのステートメントだけが得られます。 –

+0

@IvanValerianiコンストラクタが存在しない場合にのみデフォルトのコンストラクタを作成します。 'B()'がデフォルトで呼び出す 'super()'コンストラクタがなければ、コードはコンパイルされません。この場合、修飾子にかかわらず空のものは作成されません。 –

答えて

3

//アクセス修飾子を追加しないと公開されます。

アクセス修飾子を追加しないと、同じクラス内からのみアクセス可能であることを意味するpackage defaultアクセス修飾子が与えられます。

  • private:同じクラスからのアクセス
  • default

    は4つのアクセス修飾子(最も制限の制限の少ないまで)を持っているパッケージからのアクセス(あなたがそれを指定する必要はありません、defaultです

  • publicパッケージからと子クラスからのアクセス:どこでも
  • からのアクセス別の使用
  • protectedと予約語

私はクラスにmainメソッドを実行すると、これが結果です:

のみAのコンストラクタの実行開始コンストラクタ。しかし、私が をAコンストラクタとBコンストラクタの前にpublicに先行させると、これは という結果になります。

を開始

Bのコンストラクタ

を開始したコンストラクタ実際に何が起こるかは

A() { 
    super(); <--- THIS IS ADDED AT COMPILATION CALLING B's CONSTRUCTOR 
    System.out.println("B constructor initiated"); 
} 

次されますが、別のパッケージにしている場合は、コードが「コンパイルしません。

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The constructor B() is not visible 

    at A.<init>(A.java:7) 
    at A.main(A.java:11) 
0123次のコンパイルエラーが発生する

解決策はもちろん、コンストラクタのアクセス修飾子をpublicに変更することです。

+0

privateは、同じクラスだけでなく、内部クラスに対しても使用できます。 –

+0

@IvanValeriani内部クラスはクラスの一部です。 –

2

デフォルトのpublic可視性は、クラスではなくインターフェイスに属するメソッドに対してのみtrueになります。

関連する問題