sintaxis simple polimorfismo para herencia ejercicios ejemplos definicion java constructor inner-classes scjp

simple - polimorfismo java



¿Cómo llamar a un constructor padre específico desde la clase interna anónima? (3)

Ok, entonces sé que una clase interna anónima extiende implícitamente una clase padre o implementa una interfaz y, por lo tanto, será necesario llamar a un constructor de la superclase. Sin embargo, no estoy seguro de cómo crear un constructor para la clase anónima (si esto es posible) y sin definir un constructor, no estoy seguro de cómo hacer llamadas a super ()! Aquí está mi código de práctica:

public class AnonymousConstructor { public static void main(String[] args) { //I''m not sure how to explicitly call one of the arg super constructors MyBob my = new MyBob() { //I would like to do something like this super("String"); or //super("String", "String"); }; } } class MyBob extends Thread { MyBob() { System.out.println("No arg constructor"); } MyBob(String a) { System.out.println("Arg constructor"); } MyBob(String a, String b) { System.out.println("2 arg constructor"); } public void run() { System.out.println("Outer"); } }

Mi preocupación es que si intenta hacer una clase anónima de una clase que no tiene un constructor no-arg, el código fallará en tiempo de compilación porque no hay forma de pasarle un argumento al superconstructor. ¿Es esto una preocupación válida, y si es así, hay una forma de evitar esto?


Cada clase (sin un constructor específico) tiene un constructor no-arg por defecto. Se insertará un constructor vacío y javac colocará una llamada super() .

En tu ejemplo actual, podrías decir

new MyBob() { // anonymous MyBob sub-class 1, uses No arg constructor. } new MyBob("test") { // anonymous MyBob sub-class 2, uses Arg constructor. }

o

new MyBob("test", "ing") { // anonymous MyBob sub-class 3, uses 2 arg constructor. }


En Java, necesitas tener un constructor sin importar qué. Puede ser tan simple como

public AnonymousConstructor() { }

También no hay}; en Java, simplemente no pongas ese punto y coma. También siempre quiere usar modificadores de acceso, es decir, "públicos, privados o protegidos". Ahora debería poder llamar al superconsumidor.

Para la clase principal, es estático y por lo tanto no necesita un constuctor. Si desea crear un método en la clase principal, debe ser estático.


No puede definir un constructor para una clase anónima ( parte de la especificación del lenguaje), pero puede controlar a qué superconstructor se llama simplemente proporcionando argumentos a la new llamada:

MyBob my = new MyBob("foo") { // super(String) is called // you can add fields, methods, instance blocks, etc, but not constructors }