内部类加protected的问题

出错代码
package org.example;

public class A {
  protected static class Inner{
    static public int n = 2;
  }
}
package org.example.nono;
import org.example.A;

public class B extends A {
  public void test(){
    System.out.println(Inner.n); //这句正常
    Inner e = new Inner(); //这句报错
  }
}
结果

在子类B中调用父类A的内部类Inner去创建一个对象时,报错了,如下:

Inner() 在 org.example.A.Inner 中是 protected 访问控制

原因

一句话总结就是:能够访问类Inner 不等于 能够访问类Inner的构造函数。

首先,通过Inner.n执行正常可以看出B的确能够访问类Inner,这点符合我们对protected的理解。

但是创建Inner对象时B需要访问类Inner的构造函数,而B访问不了Inner的构造函数所以就出错了。

我们没有定义Inner的构造函数,所以编译器默认为我们加了构造函数,访问权限就跟Inner类一样(protected)。所以如果要访问Inner(),就得是跟Inner类在同一个包下,或者是Inner类的子类。显然B并没有满足上面两条。此时Inner类对B来说就像一个普通的类,可以访问这个类,但是对类内加了protected的成员不能访问。

解决办法
  1. 自己定义public构造函数
    public Inner(){}
    
  2. 让A和B在同一个包下,这样B就和Inner在同一个包下了。
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值