通过阅读“Java思考”,我坚持在ex:6的内部类章节。
练习6:(2)在自己的包中创建至少一个方法的接口。在一个单独的包中创建一个类。添加实现接口的受保护的内部类。在第三个包中,从类继承,并在方法中返回受保护的内部类的对象,并在返回期间向上转换到接口。
这是我的密码:
IOne.java
接口
package intfpack;
public interface IOne{
void f();
}COne.java
具有实现接口的受保护的内部类的
package classpack;
import intfpack.*;
public class COne{
protected class Inner implements IOne{
public void f(){System.out.println("Inner class of COne");}
}
}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();
}
}科普米勒接着说:
javac CTwo.java
CTwo.java:9: Inner() has protected access in classpack.COne.Inner
IOne io = new Inner();
^
1 error但书中说,我可以访问派生类中受保护的内部类。错误在哪里?
发布于 2009-09-28 15:43:41
错误消息是在抱怨构造函数受到保护,而不是类。但是,您还没有在发布的代码中显式定义构造函数。在本例中,根据JLS将保护默认构造函数(与类相同)。
发布于 2009-09-28 15:54:10
您需要为public class定义一个class构造函数。
public class COne {
protected class Inner implements IOne{
public Inner() { }
public void f(){System.out.println("Inner class of COne");}
}
}发布于 2009-11-10 23:03:20
这很明显。但这里有件很奇怪的事。
根据JLS如果CTwo扩展了COne.Inner,则预期它将访问COne.Inner的受保护构造函数,但实际上它不.见下文。
package p1;
public class COne {
public static class Inner {
protected Inner() {}
}
}
package p2;
public class CTwo extends COne.Inner {
public void getIface() {
new COne.Inner();
// Compile time error anyway with the same complains:
// "Inner() has protected access in p1.COne.Inner"
// ...unlike my expectations...
}
} https://stackoverflow.com/questions/1487734
复制相似问题