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
}