Java父子类内部类访问:子类调用父类内部类protected权限是否足够?
问题1:子类内部访问父类定义的Inner内部类的方法
由于子类自定义了同名的Inner内部类,子类作用域内默认使用Inner时会优先指向子类自身的内部类,要访问父类的Inner需要显式添加父类类名限定:
- 引用父类Inner类型的写法为
Parent.Inner - 非静态内部类的实例化必须绑定外部类的实例,示例代码如下:
public class Child extends Parent{ protected class Inner{ } public void test() { // 先创建父类实例 Parent parentIns = new Parent(); // 基于父类实例实例化父类的Inner类 Parent.Inner parentInner = parentIns.new Inner(); } }
问题2:父类方法使用子类Inner作为入参的可行性
仅将Inner设置为protected访问权限无法实现该需求,核心原因如下:
- 父子类的同名
Inner是完全独立的两个类型,Parent.Inner和Child.Inner不存在默认的继承关系,父类方法myMethod(Inner inner)中的参数类型默认是Parent.Inner,和子类的Inner类型不兼容,无法直接接收子类Inner的实例。 - 父类是继承结构中的上层抽象,编码阶段无法预知子类会定义的内部类,本身也不允许依赖子类的类型定义,所以不可能直接在父类方法的参数中声明子类的内部类类型。
如果要实现类似的参数兼容能力,需要先让子类的Inner显式继承父类的Inner,再配合泛型做参数适配,仅调整访问权限达不到目的。
内容的提问来源于stack exchange,提问作者BamDoya
相关产品推荐
相关产品推荐

