Как вызвать конкретный родительский конструктор из анонимного внутреннего класса?
Итак, я знаю, что анонимный внутренний класс либо неявно расширяет родительский класс, либо реализует интерфейс, и поэтому необходимо вызвать конструктор суперкласса. Тем не менее, я не уверен, как создать конструктор для анонимного класса (если это возможно), и без определения конструктора я не уверен, как делать вызовы 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, который не будет работать во время компиляции, потому что нет способа передать аргумент суперконструменту. Является ли это серьезной проблемой, и если да, есть ли способ обойти это?
Ответы
Ответ 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. Если вы хотите создать метод в основном классе, он должен быть статическим.