Java 重写方法,为什么可以';我不能参考自己的新方法吗?
我不明白这一点:Java 重写方法,为什么可以';我不能参考自己的新方法吗?,java,inner-classes,Java,Inner Classes,我不明白这一点: 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 n
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()方法,而在第二种情况下我可以调用它?您正在创建一个新的匿名类型,使用一个名为
hello
的新方法
您可以对表达式new OnGlobalLayoutListener(){}
调用hello
,因为该表达式的类型是新的匿名类型
您不能在listener
上调用hello
,因为listener
的编译时类型是OnGlobalLayoutListener
,它没有hello
方法
如果您想添加额外的方法,我个人建议您在当前类中创建一个新的嵌套类。您可以在一个方法中声明一个新的命名类,但我不建议这样做,因为它会造成混乱
请注意,onGlobalLayout
的覆盖与问题完全无关。如果你尝试写作,你会看到同样的事情:
new Object {
public void hello() { ... }
}
您正在使用名为
hello
的新方法创建一个新的匿名类型
您可以对表达式new OnGlobalLayoutListener(){}
调用hello
,因为该表达式的类型是新的匿名类型
您不能在listener
上调用hello
,因为listener
的编译时类型是OnGlobalLayoutListener
,它没有hello
方法
如果您想添加额外的方法,我个人建议您在当前类中创建一个新的嵌套类。您可以在一个方法中声明一个新的命名类,但我不建议这样做,因为它会造成混乱
请注意,onGlobalLayout
的覆盖与问题完全无关。如果你尝试写作,你会看到同样的事情:
new Object {
public void hello() { ... }
}
在这两种情况下,都可以通过创建一个实例来实例化对象,但引用
hello()
方法的方式不同:
在第一种情况下,将实例化的类分配给OnGlobalLayoutListener
接口的引用。问题是接口没有声明hello()
方法,因此无法调用它。但是,如果尝试调用onGlobalLayout()
,则没有问题
在第二种情况下,
hello()
方法是可访问的,因为您在引用刚实例化的类时调用它。与接口不同,该类有两个方法,重写的onGlobalLayout()
和请求的hello()
方法。在这两种情况下,您都可以通过创建
在第一种情况下,将实例化的类分配给OnGlobalLayoutListener
接口的引用。问题是接口没有声明hello()
方法,因此无法调用它。但是,如果尝试调用onGlobalLayout()
,则没有问题
在第二种情况下,hello()
方法是可访问的,因为您在引用刚实例化的类时调用它。与接口不同,该类有两个方法,重写的onGlobalLayout()
和请求的hello()
方法。与中的相同问题相同