java - mvc - spring security module
¿Puede una clase no tener constructor? (6)
Java no requiere realmente un constructor explícito en la descripción de la clase. Si no incluye un constructor, el compilador de Java creará un constructor predeterminado con un argumento vacío.
Este es un fragmento de código como ejemplo, después de este descanso solo son métodos (busque en la parte inferior de la clase de laberinto). Así que cuando esto es instanciado, usando
Maze labyrinth = new Maze();
y
System.out.println (labyrinth);
Esto imprimirá la matriz de la cuadrícula. ¿Esto es legítimo? Pensé que todas las clases necesitaban constructores, ¿cómo se imprime la matriz de cuadrícula 2-d?
Clase de laberinto:
public class Maze
{
private final int TRIED = 3;
private final int PATH = 7;
private int[][] grid = { {1,1,1,0,1,1,0,0,0,1,1,1,1},
{1,0,1,1,1,0,1,1,1,1,0,0,1},
{0,0,0,0,1,0,1,0,1,0,1,0,0},
{1,1,1,0,1,1,1,0,1,0,1,1,1},
{1,0,1,0,0,0,0,1,1,1,0,0,1},
{1,0,1,1,1,1,1,1,0,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0},
{1,1,1,1,1,1,1,1,1,1,1,1,1} };
public String toString ()
{
String result = "/n";
for (int row = 0; row < grid.length; row++)
{
for (int column=0; column < grid[row].length; column++)
result += grid[row][column] + "";
result += "/n";
}
return result;
}
}
La respuesta típica a esta pregunta es "si no declara un constructor, se crea un constructor predeterminado". Eso suele ser cierto, pero no siempre . Es posible que una clase no tenga constructor.
(Una distinción importante para dibujar aquí es que la JVM no requiere que todos los archivos de clase tengan un constructor ; sin embargo, cualquier clase definida en Java tiene un constructor predeterminado si un constructor no se declara explícitamente . Esta respuesta presenta una rareza donde un ejemplo de lo anterior se crea a partir del código de Java).
Considere el siguiente código, de esta pregunta :
public class Outer
{
private class Inner {}
void someMethod()
{
Inner inObj = this.new Inner();
}
}
Si compilas esto con OpenJDK, encontrarás 3 archivos de clase:
Outer.class
Outer$Inner.class
Outer$1.class
Outer$1
es el más inusual de estos: literalmente no tiene nada, ni siquiera un constructor:
Compiled from "Outer.java"
class Outer$1 {
}
mientras que las clases Inner
y Outer
tienen los constructores generados:
Compiled from "Outer.java"
class Outer {
Outer(); <------------- Generated Constructor
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
void someMethod();
Code:
0: new #2 // class Outer$Inner
3: dup
4: aload_0
5: aconst_null
6: invokespecial #3 // Method Outer$Inner."<init>":(LOuter;LOuter$1;)V
9: astore_1
10: return
}
Compiled from "Outer.java"
class Outer$Inner {
final Outer this$0;
Outer$Inner(Outer, Outer$1); <------------- Generated Constructor
Code:
0: aload_0
1: aload_1
2: invokespecial #1 // Method "<init>":(LOuter;)V
5: return
}
No se requiere definir explícitamente un constructor; sin embargo, todas las clases deben tener un constructor, y se generará un constructor vacío predeterminado si no proporciona ninguno:
public Maze() {
}
Ver constructor por defecto .
Para ser más precisos, el compilador proporciona automáticamente un constructor sin argumentos para una clase que no tiene un constructor, este constructor llama al constructor sin argumentos de la superclase , si la superclase no tiene un constructor sin argumentos , Es un error, si lo hace, está bien.
Si su clase no tiene una superclase explícita, entonces tiene una superclase implícita ( Object
), que tiene un constructor sin argumentos .
Si no escribe el constructor explícitamente, el compilador generará un constructor sin argumentos de forma predeterminada.
public Maze(){
}
se incluirá lo anterior Si no escribe el constructor explícitamente, el compilador generará un constructor sin argumentos de forma predeterminada.
public Maze(){
}
Lo anterior será incluido por el compilador.
Por ejemplo, compruebe el código de bytes para esta clase:
public class ABC {
}
CÓDIGO BYTE:
public class sorting/ABC {
// compiled from: ABC.java
// access flags 0x1
public <init>()V //Default no-args constructor included by the compiler
L0
LINENUMBER 7 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.<init>()V
RETURN
L1
LOCALVARIABLE this Lsorting/ABC; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
}
Si no especifica un constructor, el compilador generará un constructor predeterminado.
Sin embargo, cualquier variable miembro que no se inicialice cuando se declare será nula.
En otras palabras, si no asigna un valor a la cuadrícula (como lo hace en su ejemplo) será nulo.
Su ejemplo funciona bien porque le asigna un valor a la cuadrícula inmediatamente después de declararlo.