9

这是我想要完成的事情

文件 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();

这个错误是预期的吗?难道我做错了什么?

4

1 回答 1

11

问题

几个重要的事实(许多人忘记或不知道):

  1. 默认构造函数(包括用于静态和非静态嵌套类的构造函数)与它们所属的类的可见性具有相同的可见性。所以如果protected class Nested{...}它的默认构造函数也是protected.
  2. 具有可见性的元素protected只能从类访问
    • 与声明该元素的类属于同一包,
    • 扩展(显式或隐式)声明它的类。

你的Class2 extends Class1所以它只能访问成员Class1(包括访问Nested类型)。但自从有了

  • 不扩展Nested(即使是隐含的,它只继承对它的访问,因为它是protected
  • 不属于同一个包Nested

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

解决方案:

要解决该问题,请通过以下任一方式制作Nested构造函数public

  • Nested使用public修饰符显式创建类的无参数构造函数:

    package net;
    
    public class Class1 {
    
        protected static class Nested {
    
            public Nested(){
          //^^^^^^
            }
    
        }
    
    }
    
  • 制作Nestedpublic(它的默认构造函数也将公开 - 见第 1 点。)

    package net;
    
    public class Class1 {
    
        public static class Nested {
      //^^^^^^
        }
    
    }
    
于 2012-07-23T01:33:19.127 回答