返回类型为何影响返回对象方法访问?私有内部类实例解析
为什么私有内部类以公共接口类型返回时能访问方法,以自身类型返回却不行?
这本质是Java的类型可见性和多态机制共同作用的结果,拆解来看:
- 私有内部类的可见性限制
你定义的Iterator是私有内部类,它的可见范围仅局限于外部类内部,外部类之外的代码完全无法识别这个类——换句话说,其他类根本不知道Iterator这个私有类的存在,自然没法用这个类型来接收返回值,更没法调用它的方法。
所以方式二的写法在外部类外调用时,编译器会直接报错:找不到Iterator类,因为这个类对外部是完全不可见的。
- 公共接口的多态适配
方式一返回的是java.util.Iterator<String>——这是Java提供的公共接口,所有类都能访问这个接口类型。
虽然实际返回的对象是你那个私有内部类的实例,但编译器会把它向上转型为公共接口类型。而你在私有内部类中已经重写了接口的next()、hasNext()方法,这些方法在接口中是public修饰的,属于公共可访问的方法。
按照多态的规则,只要是接口定义的公共方法,不管实现类的可见性如何,通过接口引用都能正常调用——因为此时代码依赖的是公共接口的契约,而非私有实现类的类型。
另外要注意:你私有内部类里的next()和hasNext()是public修饰的(@Override继承了接口方法的访问权限),只是因为类本身是私有,外部无法直接通过类类型访问,但通过公共接口的话,就绕开了类的可见性限制,直接调用接口约定的公共方法。
内容的提问来源于stack exchange,提问作者idetyp
相关产品推荐
相关产品推荐

