java - team foundation server 2017 español
Diferencia entre prueba nueva() y prueba nueva(){} (7)
El tipo de tiempo de ejecución de ambas referencias sería diferente. Tratar:
System.out.println(t1.getClass()); // class Test
System.out.println(t2.getClass()); // class Test$1
Verá salida diferente. Por lo que respecta a la razón, la new Test() { }
expresión new Test() { }
crea una instancia de una subclase anónima de Test
. Entonces, la Test$1
es una subclase de Test
.
Ahora, la razón por la que está obteniendo ese error es que le falta un signo +
:
System.out.println(t1.x + " " + t2.x);
^
Puedes encontrar más detalles sobre esta publicación y esta publicación
¿Cuál es la diferencia entre estas dos formas de instanciar nuevos objetos de una clase de la siguiente manera:
Test t1=new Test();
Test t2=new Test(){ };
Cuando probé el siguiente código, pude ver que ambos objetos podían acceder al método foo()
, pero t2 no puede acceder a la variable x
(la variable x
no se puede resolver):
public class Test
{
int x=0;
public void foo(){ }
public static void main (String args[])
{
Test t1=new Test();
Test t2=new Test(){ };
t1.x=10;
t2.x=20;
t1.foo();
t2.foo();
System.out.println(t1.x+" "t2.x);
}
}
echas de menos al operador + en la línea inferior, prueba esto
System.out.println(t1.x+" "t2.x);
utilizar esta
System.out.println(t1.x+" "+t2.x);
un)
Test t1=new Test();
Al hacer esto, crea un objeto de prueba de clase llamando al constructor predeterminado
segundo)
Test t2=new Test(){ };
Y al hacer esto, está creando un objeto de una clase que extiende la clase de prueba, esta clase no tiene nombre y, por lo tanto, se llama "clase interna anónima", por ejemplo.
Test t2=new Test(){
// this is the body of the anonymous(un-named) class
//you can overide the method foo() here
// you can write more methods here but you will not be able to call them
// for example
public void doSomething(){}
};
doSomething () no es accesible desde el exterior, ya que t2 es decir, referencia (puntero) a este objeto (objeto de clase interna anónima que extiende Test) solo entiende el método foo () ya que es referencia de clase padre
doSomething () solo se puede invocar si haces esto
Test t2= new Test(){
public void foo()
{
doSomething();
}
public void doSomething(){
System.out.println("Do Something");
}
};
es decir, se llama explícitamente a doSomething () en foo () y foo () es accesible desde el exterior
t2.foo();
Nota: Escriba el nombre de la clase correctamente, la primera letra de la clase debe ser mayúscula
public class Test{}
Cuando empiezas a escribir grandes cantidades de código, te ayudará a ti y a los demás, ya que hace que tu código sea legible.
Test t2=new Test();
creará el objeto de la clase de prueba.
Pero Test t2=new Test(){ };
creará un objeto de subclase de prueba (es decir, clase interna anónima en este caso).
puede proporcionar la implementación de cualquier método de allí como
Test t2=new Test(){
public void foo(){ System.out.println("This is foo");}
};
de modo que cuando se llame al método foo()
desde el objeto t2
se imprima This is foo
.
Adición
El error de tiempo de compilación en su código se debe a la falta del operador de concatenación
System.out.println(t1.x+" "+t2.x);
###
Test t1=new Test();
Aquí, está creando una instancia de clase de Test
y se la asignó a t1
Test t2=new Test(){ };
Aquí, ha creado una subclase de Test
anónima y la crea y la asigna a t2
Y, cometió un error aquí en la siguiente línea, lo corrigió, se perdió +
System.out.println(t1.x + " " + t2.x);
Test t2=new Test();`
creará el objeto de la clase de prueba.
Test t2=new Test(){ };
creará un objeto de subclase de prueba (es decir, clase interna anónima en este caso).
Test t2=new Test(){
public void foo(){ System.out.println("foo");}
};
cuando se llama al método foo () desde el objeto t2, se imprimirá foo.
test t1=new test();
Esto creará una nueva instancia de test
de clase
test t2=new test(){ };
Esta es una clase interna anónima que extiende la test
clase