この単純なクラスは、その機能の一部をテストするためだけに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
を使用しても、クラスの静的フィールドが変更されないのはなぜですか?
Javaでは、コンストラクターではないメソッド。クラスの名前と特定の可視性のみがあります。何かを返すと宣言した場合、コンストラクタではありません、それがvoid
を返すと宣言したとしても。ここで違いに注意してください:
public class SomeClass {
public SomeClass() {
//constructor
}
public void SomeClass() {
//a method, NOT a constructor
}
}
また、クラスでコンストラクターが定義されていない場合、コンパイラーは自動的にデフォルトのコンストラクターを追加します。
public void class1()はコンストラクターではなく、名前がクラス名と一致するvoidメソッドです。呼び出されることはありません。代わりに、Javaはデフォルトのコンストラクターを作成します(作成していないため)。これは何もしません。
定義上、コンストラクターでvoidを使用すると、コンストラクターではなくなります。コンストラクターには特に戻り値の型はありません。 voidは、Wordの厳密な意味で値を返しませんが、それでも戻り値の型と見なされます。
2番目の例(voidを使用する場合)では、メソッドがコンストラクターではなくなったため、メソッドを呼び出すためにh.class1()
を実行する必要があります。または、ボイドを削除することもできます。
これは間違いなくJavaの設計上の欠陥です。
class MyClass {
// this is a constructor
MyClass() {...}
// this is an instance method
void MyClass() {...}
}
完全に合法です。おそらくそうではないはずですが、そうです。
あなたの例では、class1()はコンストラクターではないため、呼び出されることはありません。代わりに、デフォルトのコンストラクターが呼び出されます。
提案:Java命名規則をよく理解してください。クラス名は大文字で始める必要があります。