Java内部类和继承
我正在阅读思考在Java中,我遇到了一个小问题。我正在从第8章开始练习12.Java内部类和继承
在其自己的包中至少创建一个方法的接口。在>单独的包中创建一个类。添加一个实现接口的受保护的内部类。在第三个包中,继承自类,并在方法内部返回受保护的内部类的对象,并在返回期间向接口上传。
所以我创建这些.java文件:
A.java
package c08;
public interface A
{
void one();
}
Pr2.java
package c082;
import c08.*;
public class Pr2
{
protected class InPr2 implements A
{
public void one() {System.out.println("Pr2.InPr2.one");}
protected InPr2() {}
}
}
Ex.java
package c083;
import c082.*;
import c08.*;
class Cl extends Pr2
{
A foo()
{
InPr2 bar=new InPr2();
return bar;
}
}
我的NetBeans IDE中强调
InPr2();
,并说:InPr2()已在受保护访问C082.Pr2.InPr2我想知道这是为什么。 如果我没有明确说明InPr2中的构造函数应该受到保护,它只能在C082包中访问,但是当我继承了类Pr2时,它应该在Cl类中提供,因为InPr2是受保护的?当我将构造函数更改为public时,一切都很好。
它应该工作得很好,因为你有它,除了改变protected InPr2() {}
为public InPr2() { }
。换句话说,“如果任何人都能看到课程开始,任何人都可以实例化这个课程。”
的InPr2
构造函数是受保护的,这意味着只能从InPr2
(不Pr2
)继承类可以调用它。从Pr2
继承的类可以请参阅类Pr2
,但它们无法调用其受保护的成员,如受保护的构造函数。
有道理,我只是觉得,如果我继承了Pr2,我应该自动获得受保护的类。 – Andrew
@Andrew:是的,所以我相信C1应该能够看到_class_'InPr2',因为'InPr2'是'Pr2'的受保护成员。然而,构造函数不是'Pr2'的成员。 – RustyTheBoyRobot
尽管InPr2
可通过Cl
,访问,但其构造函数不是。受保护的构造函数只能访问同一包中的子类和类。
变化:
Pr2.java
package c082;
import c08.*;
public class Pr2
{
protected class InPr2 implements A
{
public void one() {System.out.println("Pr2.InPr2.one");}
// This constructor was available only
// to a class inheriting form Pr2.InPr2 - protected InPr2() {}
public InPr2() {}
}
}
从Pr2.InPr2
构造函数只是提供一类,如果它扩展Pr2.InPr2
。
受保护的成员变量,方法和构造函数在包之外是不可访问的,除非它们是继承的。 当我们尝试创建InPr2的对象时,编译器将显示错误,因为受保护的构造函数不能在包外部访问。 对象的创建也取决于构造函数的访问修饰符。
你可以做一两件事:InPr2可C类里面继承
的[同时继承了无法访问受保护的内部类]可能重复(http://*.com/questions/1487734/cant-访问保护内部类继承) – Kal