假设我有这个抽象类:
package test.one;
public abstract class One {
protected abstract void whatever();
public void run() {
whatever();
}
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
package test.two;
import test.one.One;
public class Three {
public static void main(String[] args) {
One one = new One() {
@Override
protected void whatever() {
System.out.println("Do whatever..");
}
};
one.whatever();
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码编译失败,这是预料之中的。
test/two/Three.java:14: error: whatever() has protected access in One
one.whatever();
^
1 error
Run Code Online (Sandbox Code Playgroud)
但下面的代码编译成功,这似乎令人惊讶:
test/two/Three.java:14: error: whatever() has protected access in One
one.whatever();
^
1 error
Run Code Online (Sandbox Code Playgroud)
不同之处在于,在后一种情况下,我在没有命名引用的情况下访问该方法。为什么编译器允许这样的访问?
Jon*_*eet 20
不同之处在于,在后一种情况下,我在没有命名引用的情况下访问该方法。为什么编译器允许这样的访问?
不,区别在于,在后一种情况下,您访问的是匿名类上的方法,而不是类型的引用上的方法One。
抛开受保护访问的奇怪之处不谈,只需创建一个具有公共方法的匿名类,您就可以很容易地看到差异:
class Test {
public static void main(String[] args) {
// This is fine...
new Object() {
public void method() {
System.out.println("Called");
}
}.method();
// This is not, because Object doesn't contain a method called "method".
Object o = new Object() {
public void method() {
System.out.println("Called");
}
};
o.method();
}
}
Run Code Online (Sandbox Code Playgroud)
正如注释中所述,获得相同效果的另一种方法是使用var,以便变量的编译时类型是匿名类。
即使匿名类中的私有成员也可以在包含范围内访问,就像它们是普通的嵌套类一样。
| 归档时间: |
|
| 查看次数: |
951 次 |
| 最近记录: |