2016-04-12 11 views
0

これはJavaのコンストラクタについての私の知識と誤解されているかどうかは不明ですが、最近CodingGroundでテストされたコードで質問に答えました。コードがあって、最も単純な形で:私はそれを実行したときに今これは、罰金コンパイルけどJavaコンストラクタが呼び出されていませんか?

class A { 
    int myX; 
    public void A() { 
     System.out.println("A constructor"); 
    } 
    public void setValue(int x) { 
     System.out.println("A setter"); 
     myX = x; 
    } 
} 
public class HelloWorld{ 
    public static void main(String []args){ 
     A a = new A(); 
     a.setValue(7); 
    } 
} 

、出力されました:

A setter 

コンストラクタ呼び出しからの出力に何が起こりましたか?

実際には、コンストラクタが呼び出されていないので、出力があまり消えないようです。コンストラクタに

myX = 42; 

とやってセッターを変更します:は、ので、私は追加するとき

System.out.println("A setter: " + myX); 

値を変更する前に、私が見出力は次のようになります。

A setter: 0 

でつまり、初期値は決して42に設定されていません。

+0

のデフォルトコンストラクタは、あなたがコンストラクタを持っていないです。)(デフォルト以外の) –

+0

@paxdiablo私は誰かがha 458Kを超えると、常に小さなものを逃すことができます:-)。 public void A()をpublic A()に変更します。 – HenryDev

+0

@HenryDev、ええ、私はC#/ Mono/C++に大きく依存しています。 – paxdiablo

答えて

5

Aという名前の関数を、Aクラス内に定義しました。この関数は引数を受けずにvoidを返します。それはコンストラクタではありません!

変更:

public A() 

public void A() 

あなたは、この方法は、あなたのAクラスのコンストラクタになりたい場合は(コンストラクタが何の戻り値を持たない)

+4

男、私は愚かな気がするのですか? :-) – paxdiablo

0

voidという名前の方法がAとなっています。この

public void A() { 

はようになり、あなたのクラスAは、コンパイラによって挿入されたデフォルトの引数なしのコンストラクタを取得している

public A() { 

でなければなりません。

0

あなたが持っていないからですコンストラクタではなく、コンストラクタ名を持つメソッドがあります。

voidを削除します。

public A() 

あなたのIDEには、何かが進行中だったことを警告するためにこの警告を示している必要があります。

このメソッドはコンストラクタ名

+0

私の "IDE"は 'javac Prog.java && java Prog'です:-)興味深いことに、' javac'自体はこれを警告しません。 – paxdiablo

+0

Whelp、それはあなたに警告を表示しないでしょう; D –

0

デフォルトコンストラクタがpublicで、クラス名と同じにする必要があります持っていますアクセス指定子。あなたはpublic A();として

public A(); 

代わりの

public void A(); 

を使用する必要があり、あなたの例では

public class Example{ 
    public Example(){} // the function with no return type,not even void. this is the default constructor 
} 

クラスA

関連する問題