2017-03-25 5 views
1

私はJavaを勉強しており、本書では "Javaコンパイラは最初の文が呼び出されない場合は引数なしのコンストラクタsuper()親コンストラクタです。 "継承とコンストラクタでのJava 8コンパイラ拡張の明確化

しかし私にとっては完全なものです。「Javaコンパイラは、最初の文が親コンストラクタへの呼び出しでない場合、引数のないコンストラクタsuper()への呼び出しを自動的に挿入します。 ) "this()は、パラメータの有無にかかわらずクラス内の任意のコンストラクタを意味します。

ケース1:

public class MyClass{ 
    public MyClass() {} 
} 

私は何を意味することはケース1で、コンパイラは確かに最初のステートメントとしてsuper()を追加しますが、ケース2には、それは引数でコンストラクタのためにしないということですコンパイル後

、次のようになります。

public class MyClass { 
    public MyClass() {super();} 
} 

ケース2:

public class MyClass{ 
    public MyClass() {} 
    public MyClass(int num) { this(); } 
} 
0123コンパイル後

は、次のようになります。

public class MyClass{ 
    public MyClass() {super();} 
    public MyClass(int num) { this(); } 
} 

答えて

3

あなたは非常に正しい、などthis()と同じクラスの別のコンストラクタの呼び出しも完全に有効です。今度はデフォルトObject()コンストラクタを呼び出しMyClass()

$ javap -c ../MyClass.class 
Compiled from "MyClass.java" 
public class MyClass { 
    public MyClass(); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: return 

    public MyClass(int); 
    Code: 
     0: aload_0 
     1: invokespecial #2     // Method "<init>":()V 
     4: return 
} 

MyClass(int)コンストラクタ代表者:あなたはjavapツールを使用して、Javaコンパイラによって放出されたバイトコードを見ることができます。

+0

私はこのことを分かりませんでした。 – Mouss

関連する問題