web-dev-qa-db-ja.com

java "void"および "nonvoid"コンストラクタ

この単純なクラスは、その機能の一部をテストするためだけにJavaで記述しました。

public class class1 {
    public static Integer value=0;
    public class1() {
       da();
    }
    public int da() {
        class1.value=class1.value+1;
        return 5;
    }
    public static void main(String[] args) {
       class1 h  = new class1();
       class1 h2 = new class1();
       System.out.println(class1.value);
    }
}

出力は次のとおりです。

2

しかし、このコードでは:

public class class1 {
    public static Integer value=0;
    public void class1() {
        da();
    }
    public int da() {
        class1.value=class1.value+1;
        return 5;
    }
    public static void main(String[] args) {
        class1 h  = new class1();
        class1 h2 = new class1();
        System.out.println(class1.value);
    }
}

このコードの出力は次のとおりです。

では、コンストラクターメソッド宣言でvoidを使用しても、クラスの静的フィールドが変更されないのはなぜですか?

11
Hadi

Javaでは、コンストラクターではないメソッド。クラスの名前と特定の可視性のみがあります。何かを返すと宣言した場合、コンストラクタではありません、それがvoidを返すと宣言したとしても。ここで違いに注意してください:

public class SomeClass {
    public SomeClass() {
        //constructor
    }
    public void SomeClass() {
        //a method, NOT a constructor
    }
}

また、クラスでコンストラクターが定義されていない場合、コンパイラーは自動的にデフォルトのコンストラクターを追加します。

43
Luiggi Mendoza

public void class1()はコンストラクターではなく、名前がクラス名と一致するvoidメソッドです。呼び出されることはありません。代わりに、Javaはデフォルトのコンストラクターを作成します(作成していないため)。これは何もしません。

6
Khary Mendez

定義上、コンストラクターでvoidを使用すると、コンストラクターではなくなります。コンストラクターには特に戻り値の型はありません。 voidは、Wordの厳密な意味で値を返しませんが、それでも戻り値の型と見なされます。

2番目の例(voidを使用する場合)では、メソッドがコンストラクターではなくなったため、メソッドを呼び出すためにh.class1()を実行する必要があります。または、ボイドを削除することもできます。

1
Cal Stephens

これは間違いなくJavaの設計上の欠陥です。

class MyClass {

   // this is a constructor
   MyClass() {...}

   // this is an instance method
   void MyClass() {...}

 }

完全に合法です。おそらくそうではないはずですが、そうです。

あなたの例では、class1()はコンストラクターではないため、呼び出されることはありません。代わりに、デフォルトのコンストラクターが呼び出されます。

提案:Java命名規則をよく理解してください。クラス名は大文字で始める必要があります。

0
Lin Sherman