una privada otra objeto internas interfaces dentro crear clases clase anonimas anidadas java constructor inner-classes anonymous-inner-class

java - privada - crear un objeto de una clase dentro de otra clase



Constructores en clases internas(implementando interfaces) (4)

¿Cómo haría para escribir un constructor para una clase interna que está implementando una interfaz? Sé que podría hacer una clase completamente nueva, pero me imagino que debe haber una manera de hacer algo como esto:

JButton b = new JButton(new AbstractAction() { public AbstractAction() { super("This is a button"); } public void actionPerformed(ActionEvent e) { System.out.println("button clicked"); } });

Cuando ingreso esto, no reconoce el método AbstractAction como un constructor (el compilador solicita el tipo de retorno). ¿Alguien tiene alguna idea?


La clase resultante no es del tipo AbstractAction sino de algún tipo (sin nombre, anónimo) que extiende / implementa AbstractAction . Por lo tanto, un constructor para esta clase anónima tendría que tener este nombre ''desconocido'', pero no AbstractAction .

Es como una extensión / implementación normal: si define una class House extends Building y construye una House le da el nombre de Constructor House y no Building (o AbstractAction solo para volver a la pregunta original).


La razón por la que el compilador se queja es porque estás tratando de declarar un constructor dentro de tu clase anónima, lo que no está permitido para las clases anónimas. Como han dicho otros, puede resolver esto utilizando un inicializador de instancia o convirtiéndolo en una clase no anónima, para que pueda escribir un constructor para él.


Si realmente necesita un contructor por cualquier motivo, puede usar un bloque de inicialización:

JButton b = new JButton(new AbstractAction() { { // Do whatever initialisation you want here. } public void actionPerformed(ActionEvent e) { System.out.println("button clicked"); } });

Pero no puedes llamar a un constructor de clase superior desde allí. Sin embargo, como dijo Itay, puedes pasar el argumento que deseas a la llamada a new.

Aunque personalmente, crearía una nueva clase interna para esto:

private class MyAction extends AbstractAction { public MyAction() { super("This is a button."); } public void actionPerformed(ActionEvent e) { System.out.println("button clicked"); } }

entonces:

JButton b = new JButton(new MyAction());


Simplemente inserte los parámetros después del nombre de la clase extendida:

JButton b = new JButton(new AbstractAction("This is a button") { public void actionPerformed(ActionEvent e) { System.out.println("button clicked"); } });

Además, puedes usar un bloque de inicialización:

JButton b = new JButton(new AbstractAction() { { // Write initialization code here (as if it is inside a no-arg constructor) setLabel("This is a button") } public void actionPerformed(ActionEvent e) { System.out.println("button clicked"); } });