继承时无法访问受保护的内部类

ebs*_*sbk 13 java inner-classes

阅读"Thinking in Java",我坚持参加ex:6 of Inner Classes章节.


练习6:(2)在自己的包中创建一个至少包含一个方法的接口.在单独的包中创建一个类.添加一个实现接口的受保护内部类.在第三个包中,继承自您的类,并在方法内部返回受保护内部类的对象,在返回期间向上转换为接口.


这是我的代码:

IOne.java

接口

package intfpack;
public interface IOne{
        void    f();
}
Run Code Online (Sandbox Code Playgroud)

COne.java

具有实现接口的受保护内部类的类

package classpack;
import intfpack.*;
public class COne{
        protected class Inner implements IOne{
                public void f(){System.out.println("Inner class of COne");}
        } 
}
Run Code Online (Sandbox Code Playgroud)

CTwo.java

从具有受保护内部类的类继承

package thirdpack;
import classpack.*;
import intfpack.*;

public class CTwo extends COne{
        public IOne getInner(){
                IOne io = new Inner(); 
                return io;
        }
        public static void main(String[] args){
                CTwo ct = new CTwo();
                ct.getInner();
        }
}
Run Code Online (Sandbox Code Playgroud)

Copmiler说下:

javac CTwo.java
CTwo.java:9: Inner() has protected access in classpack.COne.Inner
                IOne io = new Inner(); 
                          ^
1 error
Run Code Online (Sandbox Code Playgroud)

但是这本书说我可以在派生类中访问受保护的内部类.哪里出错?

Dan*_*yer 23

错误消息抱怨受保护的构造函数,而不是类.但是您没有在发布的代码中明确定义构造函数.在这种情况下,根据JLS,默认构造函数将受到保护(与类相同).

  • 以下是Dan Dayer链接的精确解释:Inner的构造函数受到保护.但是,构造函数相对于Inner是受保护的,而Inner则相对于COne受到保护.因此,Inner可以在CTwo中访问,因为它是COne的子类.在CTwo中无法访问Inner的构造函数,因为类CTwo不是Inner的子类!因此,即使Inner是可访问的,它的默认构造函数也不是. (10认同)

bru*_*nde 9

您需要为以下内容定义public构造函数Inner class:

public class COne {

    protected class Inner implements IOne{

        public Inner() { }

        public void f(){System.out.println("Inner class of COne");}
    }
}
Run Code Online (Sandbox Code Playgroud)