Java内部类与继承

7
我目前正在阅读《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时,一切正常。


2
可能是在继承时无法访问受保护的内部类的重复问题。 - Kal
6个回答

4
< p > InPr2 的构造函数是受保护的,意味着只有继承自 InPr2 类(而不是 Pr2)的类可以调用它。继承自 Pr2 的类可以看到Pr2,但不能调用其受保护的成员,如受保护的构造函数。


1
有道理,我只是以为如果我继承了Pr2,我就应该自动获得对受保护类的访问权限。 - Andrew
@Andrew:是的,我认为C1应该能够看到类InPr2,因为InPr2Pr2的受保护成员。然而,构造函数不是Pr2的成员。 - RustyTheBoyRobot

2

只要将 protected InPr2() {} 更改为 public InPr2() { },它应该可以正常工作。换句话说,“任何人都可以实例化此类,但前提是他们能够看到该类。”


没错,但是在练习中它说我应该将这个内部类设置为protected,我想知道在继承并将构造函数设置为protected后为什么它不起作用。 - Andrew
因为访问该类的范围仅限于“具有对Pr2受保护访问权限的人员”。这包括C1,因为它扩展了Pr2。然而,在InPr2内部的构造函数仅适用于“具有对InPr2受保护访问权限的人员”,此时只有InPr2Pr2符合条件。这有意义吗?使用该类和使用构造函数的访问权限范围不同。 - corsiKa

1
尽管类InPr2Cl中可访问,但它的构造函数不可访问。受保护的构造函数只对子类和同一包中的类可访问。

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时才可用。


0

受保护的成员变量、方法和构造函数在包外不可访问,除非它们被继承。 当我们尝试创建 InPr2 对象时,编译器会显示错误,因为受保护的构造函数在包外不可访问。 对象的创建也取决于构造函数的访问修饰符。

你可以这么做:在类 C 中内部继承 InPr2。


-1

Java 中没有任何类可以被保护。


1
你能稍微解释一下你的答案吗? - NREZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接