在 java 教程 ( https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html ) 中,我读到在匿名类中您可以创建未在超类中实现的方法。但我尝试了以下方法,但不起作用:
class Superclass {
}
class Anonymous {
public void start() {
Superclass obj = new Superclass() {
public void myMethod() {
System.out.println("hello world");
}
};
obj.myMethod();
}
}
class Main {
public static void main(String[] args) {
Anonymous obj = new Anonymous();
obj.start();
}
}
Run Code Online (Sandbox Code Playgroud)
如果可能,任何人都可以解释我做错了什么,感谢您的时间。
您可以在匿名类中创建一个新方法,但由于匿名类之外的代码甚至无法知道该方法,因此您无法从外部调用它。
但是,您可以从内部调用它。
abstract class Superclass {
public abstract void doStuff();
}
class Anonymous {
public void start() {
Superclass obj = new Superclass() {
@Override
public void doStuff() {
myMethod();
}
public void myMethod() {
System.out.println("hello world");
}
};
obj.doStuff(); // prints: hello world
}
}
Run Code Online (Sandbox Code Playgroud)
进一步解释一下,匿名类就像一个未命名的本地类。
public void start() {
class $1 extends Superclass {
@Override
public void doStuff() {
myMethod();
}
public void myMethod() {
System.out.println("hello world");
}
};
Superclass obj = new $1();
obj.doStuff(); // prints: hello world
}
Run Code Online (Sandbox Code Playgroud)
如您所见,由于obj是 a Superclass,而不是 a $1,您不能调用myMethod(),也不能声明obj为$1类,因为当它是匿名的时,它没有名称1。
1) 在内部,匿名类具有名称,例如类似Anonymous$1的名称,即外部类的名称、美元符号和数字。您可以在编译器生成的.class文件中看到这些名称。但是你不能用这些名字写代码。
| 归档时间: |
|
| 查看次数: |
38 次 |
| 最近记录: |