constructor java “void” y “non void”

Escribí esta clase simple en java solo para probar algunas de sus características.

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); } } 

El resultado es:

2

Pero en este código:

 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); } } 

El resultado de este código es:

0

Entonces, ¿por qué no, cuando uso void en la statement del método constructor, el campo estático de la clase ya no cambia?

En Java, el constructor no es un método. Solo tiene el nombre de la clase y una visibilidad específica. Si declara que devuelve algo, entonces no es un constructor , incluso si declara que devuelve un void . Tenga en cuenta la diferencia aquí:

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

Además, si una clase no define un constructor, entonces el comstackdor automáticamente agregará un constructor predeterminado.

public void class1 () no es un constructor, es un método vacío cuyo nombre coincide con el nombre de la clase. Nunca es llamado. En cambio java crea un constructor predeterminado (ya que no ha creado uno), que no hace nada.

El uso de vacío en el constructor por definición lo lleva a dejar de ser el constructor. El constructor específicamente no tiene tipo de devolución. Mientras que el vacío no devuelve un valor en el sentido más estricto de la palabra, todavía se considera un tipo de devolución.

En el segundo ejemplo (donde usa el vacío), debería hacer h.class1() para que se llame al método porque ya no es el constructor. O simplemente podrías eliminar el vacío.

Podría decirse que este es un error de diseño en Java.

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

Perfectamente legal. Probablemente no debería ser, pero es.

En su ejemplo, class1 () nunca se llama, porque no es un constructor. En cambio, se llama al constructor predeterminado.

Sugerencia: familiarícese con las convenciones de nomenclatura de Java. Los nombres de las clases deberían comenzar con mayúsculas.