我不明白这一点:
OnGlobalLayoutListener listener = new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
System.out.println("I am override a method");
}
public void hello(){
System.out.println("This is a new method");
}
};
//listener.hello(); Why I cannot do it?
如果没有这个,我可以做到:
new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
System.out.println("I am override a method");
}
public void hello(){
System.out.println("This is a new method");
}
}.hello();
为什么在第一种情况下我不能调用方法hello()和第二种情况我可以这样做?
答案 0 :(得分:3)
您正在使用名为hello
的新方法创建新的匿名类型。
您可以在表达式hello
上调用new OnGlobalLayoutListener() { }
,因为该表达式的类型是您的新匿名类型。
您无法在hello
上致电listener
,因为listener
的编译时类型为OnGlobalLayoutListener
,但没有hello
onGlobalLayout
方法。
如果你想添加额外的方法,我个人建议你在当前的类中创建一个新的嵌套类。你可以在一个方法中声明一个新的命名类,但我不建议它,只是在它创建的混乱方面。
请注意,覆盖new Object {
public void hello() { ... }
}
与问题完全无关。如果你尝试写作,你会看到同样的事情:
{{1}}
答案 1 :(得分:1)
在这两种情况下,您都可以通过创建anonymous inner class来实例化对象,但引用hello()
方法的方式不同:
在第一种情况下,您将实例化的类分配给OnGlobalLayoutListener
接口的引用。问题是接口没有声明hello()
方法,因此无法调用它。但是,如果您尝试调用onGlobalLayout()
,则没有问题。
在第二种情况下,可以访问hello()
方法,因为您在刚刚实例化的类的引用上调用它。与界面相反,该类有两种方法,覆盖onGlobalLayout()
和请求的hello()
方法。