从内部类解析方法名称

时间:2014-04-01 15:33:48

标签: java

public class X {

    public void close() {
      // ...
    }

    public class XInputStream extends InputStream {

        public void f() {
           close(); // are we calling close() on InputStream or X??
        }
    }
}
  1. 编译器很好用这种东西,很明显它知道调用哪种方法。解决此问题的语言规范中究竟有什么规则?

  2. 除了重命名我的close()方法之外,我是否可以采取任何措施使这些代码更具可读性?

2 个答案:

答案 0 :(得分:7)

JLS的相关部分是§6.4.1。基本上,编译器将在可能的最小范围内查找正确的方法。它检查的第一个范围是XInputStream。它找到一个close方法,因此它会调用该方法。

为了使其更具可读性,您可以限定方法调用:this.close()致电InputStream::closeX.this.close()致电X::close

答案 1 :(得分:0)

因为你有一个内部类:

public class XInputStream extends InputStream

这里调用的close()方法是在您从中扩展的InputStream类中找到的方法。

此外,您必须使用try-catch包装close()方法,并且任何扩展InputStream的类都必须声明为abstract或实现方法read()。