2011-03-19 12 views
5

プライベートコンストラクタがある場合、JVMはスーパーコンストラクタへの呼び出しを挿入しますか?クラス内のプライベートコンストラクタの使用

私はそのプライベートコンストラクタのsuper()コールを参照しています。

class Alpha { 
    static String s=""; 
    protected Alpha(){ 
     s+="alpha"; 
    } 
} 

class SubAlpha extends Alpha{ 
    private SubAlpha(){ 
     s+="sub"; 
    } 
} 

class SubSubAlpha extends Alpha{ 
    private SubSubAlpha(){ 
     s+="subsubAlpha"; 
    } 

    public static void main(String[] args){ 
     new SubSubAlpha(); 
     System.out.print(s); 
    } 
} 

ここではコンパイルエラーは発生しません。ここではSubSubAlphaクラスにプライベートコンストラクタがあります。コンパイラはsuper()を挿入している場合は、SubAlphaクラスで何が起こるかを呼び出します。私有のコンストラクタもあります。そして、もしそれがアクセスされなければ、継承ツリーはどのように上まで続くのですか?

+0

(スーパークラスの引数なしのコンストラクタがない場合は、民間(および派生クラス:

//: Cartoon.java // Constructor calls during inheritance class Art { Art() { System.out.println("Art constructor"); } } class Drawing extends Art { Drawing() { System.out.println("Drawing constructor"); } } public class Cartoon extends Drawing { Cartoon() { System.out.println("Cartoon constructor"); } public static void main(String[] args) { Cartoon x = new Cartoon(); } } ///:~ 

このプログラムの出力は、自動呼び出しを示してい同じ外部クラスに属していないか、またはデフォルトのアクセスであり、派生クラスが同じパッケージにないか、または単に欠落している場合)、派生クラスのコンストラクタに明示的な 'super()'または 'this() 'class Base {private Base(){}は、 } class Derived extends Base {} ') –

+2

' class SubSubAlpha extends SubAlpha'を意味しましたか? –

答えて

4

はいにコンパイルされます。プライベートコンストラクタは、明示的なsuperまたはthisコンストラクタコールがない場合、暗黙のsuper()コールを持ちます。この点で、それは他のコンストラクタと変わりありません。当然、これをコンパイルするためには、スーパークラスはクラスから見える引数のないコンストラクタを持っていなければなりません。

コンストラクタがprivateの場合、サブクラスからと呼ばれるとすることはできません。また、クラス自体から離れた他のコードからも使用できます。

-1

あなたはsuper()を使用して、スーパークラスの関数と属性を使用できます。

+0

それは問題ではありませんでした。 – dty

8

通常のJavaとの同じプライベートコンストラクタがある場合は、JVMは、スーパーコンストラクタへの呼び出しを挿入していますか?

はい

スーパーコンストラクタは常にが呼び出されます。 (クラスをインスタンス化することはできません。同時にスーパークラスをインスタンス化することはできません)

明示的に自分自身で実行しないと、コンストラクター私的または公的です。


は好き嫌いであるために:それは実際にそれを挿入JVMはありませんが、Javaコンパイラ:

public class Test { 
    private Test() { 
    } 
} 

private Test(); 
    Code: 
    Stack=1, Locals=1, Args_size=1 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 
4

コンパイル時エラーが表示されない理由は、クラス階層があなたの考えではないということです。私はあなたがこれを意味だと思う:

class SubSubAlpha extends Alpha { 

はこれをする:

class SubSubAlpha extends SubAlpha { 

...これであなたは実際にコンパイル時にエラーが発生します指しています。

(つまり、はい、です。常にスーパーコンストラクタを呼び出します。)

+0

はい...誠に申し訳ありません... – satheesh

+0

私は理解しています.... – satheesh

1

これはJava Programmer's SourceBookの素晴らしい例です。コンストラクタは呼び出されたときに出力するので、すぐに呼び出しのシーケンスが表示されます。それはJavaの思考からです。

アートコンストラクタ
描画コンストラクタ
漫画のコンストラクタ

関連する問題