team español java anonymous-inner-class

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