其他包中的派生类无法访问受保护的嵌套类

时间:2012-07-23 01:18:16

标签: java

这是我正在努力实现的目标

文件1:./ net / Class1.java

package net;

public class Class1
{
    protected static class Nested
    {

    }
}

文件2:./ com / Class2.java

package com;

import net.Class1;

public class Class2 extends Class1
{
    Nested nested = new Nested();
}

这是我得到的错误

>javac ./net/Class1.java ./com/Class2.java
.\com\Class2.java:7: error: Nested() has protected access in Nested
        Nested nested = new Nested();

预计会出现此错误吗?我做错了吗?

1 个答案:

答案 0 :(得分:10)

很少有重要事实(许多人忘记或不知道):

  1. 默认构造函数(包括静态和非静态嵌套类的构造函数)具有与它们所属的类的可见性相同的可见性。因此,在protected class Nested{...}的情况下,其默认构造函数也是protected
  2. 具有protected可见性的
  3. 元素只能由类访问
    • 属于与声明该元素
    • 的类相同的包
    • 扩展(显式或隐式)声明它的类。
  4. 您的Class2 extends Class1因此只能访问Class1的成员(包括访问Nested类型)。但是因为它

    • 不会扩展Nested(即使是隐式,它只会继承对它的访问权限,因为它是protected
    • Nested
    • 不属于同一个套餐

    它无法访问protected类(包括构造函数)中的Nested元素。

    要解决该问题,请Nested构造函数public

    package net;
    
    public class Class1 {
    
        protected static class Nested {
    
            public Nested(){
          //^^^^^^
            }
    
        }
    
    }