我正在阅读Thinking In Java,我遇到了一个小问题。我正在从第8章开始练习12。
在自己的包中创建一个至少包含一个方法的接口。在>单独的包中创建一个类。添加一个实现接口的受保护内部类。在第三个>包中,继承自您的类,并在方法内部返回受保护的>内部类的对象,并在返回期间向上转换为接口。
所以我创建了这些.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时,一切都很好。
答案 0 :(得分:4)
InPr2
的构造函数受到保护,这意味着只有从InPr2
继承的类( not Pr2
)才能调用它。从Pr2
继承的类可以查看类Pr2
,但是它们不能像受保护的构造函数那样调用其受保护的成员。
答案 1 :(得分:2)
除了将protected InPr2() {}
更改为public InPr2() { }
之外,它应该可以正常工作。换句话说,“任何人都可以实例化这个课程,如果他们可以看到课程开始。”
答案 2 :(得分:1)
尽管可以在InPr2
中访问类Cl
,但的构造函数不是。受保护的构造函数只能由同一包中的子类和类访问。
答案 3 :(得分:0)
变化:
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
时才可用于该类。
答案 4 :(得分:0)
受保护的成员变量,方法和构造函数在包外部不可访问,除非它们是继承的。 当我们尝试创建InPr2的对象时,编译器将显示错误,因为受保护的构造函数在包外无法访问。 对象的创建也取决于构造函数的访问修饰符。
你可以做一件事:InPr2可以在C类中继承。
答案 5 :(得分:-1)
java中没有类可以受到保护。