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时,一切都很好。

+2

的[同时继承了无法访问受保护的内部类]可能重复(http://*.com/questions/1487734/cant-访问保护内部类继承) – Kal

它应该工作得很好,因为你有它,除了改变protected InPr2() {}public InPr2() { }。换句话说,“如果任何人都能看到课程开始,任何人都可以实例化这个课程。”

+0

这是真的,但在excersise它说,我应该让这个内部类的保护,我想知道为什么继承和使构造保护后,它不起作用。 – Andrew

+0

因为对类的访问范围限制为'具有受保护访问'Pr2''的范围。这包括'C1',因为它扩展了'Pr2'。然而'InPr2'内部的构造函数只能用于那些可以访问'InPr2'的人,这里只有'InPr2'和'Pr2'。这有意义吗?使用类和使用构造函数的访问权限范围有所不同。 – corsiKa

InPr2构造函数是受保护的,这意味着只能从InPr2Pr2)继承类可以调用它。从Pr2继承的类可以请参阅Pr2,但它们无法调用其受保护的成员,如受保护的构造函数。

+1

有道理,我只是觉得,如果我继承了Pr2,我应该自动获得受保护的类。 – Andrew

+0

@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

java中没有类可以被保护。

+1

你能解释一下你的答案..? – NREZ

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

你可以做一两件事:InPr2可C类里面继承