Подтвердить что ты не робот

Как вызвать конкретный родительский конструктор из анонимного внутреннего класса?

Итак, я знаю, что анонимный внутренний класс либо неявно расширяет родительский класс, либо реализует интерфейс, и поэтому необходимо вызвать конструктор суперкласса. Тем не менее, я не уверен, как создать конструктор для анонимного класса (если это возможно), и без определения конструктора я не уверен, как делать вызовы super()! Вот мой код практики:

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");
    }
}

Меня беспокоит, что если вы попытаетесь сделать анонимный класс из класса, у которого нет конструктора no-arg, который не будет работать во время компиляции, потому что нет способа передать аргумент суперконструменту. Является ли это серьезной проблемой, и если да, есть ли способ обойти это?

4b9b3361

Ответ 1

Вы не можете определить конструктор для анонимного класса (часть спецификации языка), но вы можете контролировать, какой супер конструктор вызывается просто предоставив аргументы вызову new:

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

Ответ 2

Каждый класс (без конкретного конструктора) по умолчанию имеет конструктор no-arg. Будет вставлен пустой конструктор, и javac поместит вызов super().

В вашем текущем примере вы могли бы сказать

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

или

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

Ответ 3

В Java у вас должен быть конструктор, несмотря ни на что. Это может быть так же просто, как

    public AnonymousConstructor()
    {
    }

Также нет}; в java, просто не помещайте эту точку с запятой. Также вы всегда хотите использовать модификаторы доступа, т.е. "общедоступные, частные или защищенные". Теперь вы можете позвонить супер-консуктору.

Для основного класса он является статическим и, следовательно, не нуждается в constuctor. Если вы хотите создать метод в основном классе, он должен быть статическим.