Java内部类和继承

时间:2011-08-18 23:09:10

标签: java inheritance

我正在阅读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时,一切都很好。

6 个答案:

答案 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中没有类可以受到保护。