He visto esto muchas veces, pero estoy un poco confundido si esto se llamaría o no una clase anónima.
public class Test { public static void main(String[] args) { new Thread(){ @Override public void run() { System.out.println("##"); } }.start(); } }La razón por la que estoy confundido es porque las clases anónimas no tienen nombre, pero claramente ya tenemos una clase "Subproceso" en la API de Java, lo que significa que tiene un nombre, y si tiene un nombre, ¿cómo puede ser anónimo? class, y si no es una clase anónima, entonces qué es.
Sé que es un poco tonto, pero no puedo razonar de manera determinista porque veo argumentos válidos en ambos lados.
Además, arriba puedo anular claramente el método de run de la clase Thread , ahora si creo mi propia clase, digamos MyClass , defino algunos métodos en ella y luego intento hacer lo mismo que arriba, entonces ¿por qué no puedo anular los métodos de MyClass ? forma en que pude anular el método de run de la clase Thread .
public class MyClass { private void myMethod1() { } private void myMethod2() { } } public class Test { public static void main(String[] args) { new MyClass(){ // why I cannot override "myMethod1" and "myMethod1" of `MyClass`, they way I was able to override `run` method of `Thread` class }; } }MyClass : por supuesto, no puede extender métodos privados. Esto no tiene nada que ver con clases anónimas y son reglas básicas de herencia de Java. Hágalos públicos y podrá extenderlos en línea.Para aclarar, si tiene una clase anidada que tiene un nombre, puede declarar una variable de su tipo:
public class Test { private static class MyThread extends Thread { @Override public void run() { System.out.println("Foo"); } } public static void main(String[] args) { MyThread myThread = new MyThread(); } }Pero si tienes una clase anónima, no puedes hacer esto:
public static void main(String[] args) { new Thread(){ @Override public void run() { System.out.println("##"); } }.start(); // how can you declare a variable of the above type *with* its behavior? }Bit lateral: casi nunca debe extender Thread y, en su lugar, implementar Runnable, o incluso mejor, usar ejecutores para ayudarlo a hacer su subprocesamiento.
re:
Ok, gracias por su respuesta, corríjame según lo entiendo: al usar una clase anónima, puedo crear una clase nueva (básicamente, la implementación de una interfaz) en tiempo de ejecución, también puedo extender una clase existente y eso aún se llamaría "clase anónima "?
Sí , crea una clase nueva, pero no necesariamente implementa una interfaz. De hecho, su ejemplo anterior no tiene nada que ver directamente con las interfaces y todo que ver con la extensión de una clase concreta existente. Puede y, a menudo, crea clases anónimas que implementan interfaces, siendo Runnable un ejemplo común, pero su ejemplo anterior no es "básicamente la implementación de una interfaz".
Básicamente, está creando una clase anónima de Class Thread , pero debido a que Thread Class implements Runnable (que es una interfaz funcional que tiene un método abstracto) -> tiene que @override run() método que proviene de Runnable Interface