使用受保护的构造函数实例化一个类

时间:2014-03-17 09:34:03

标签: java protected access-modifiers

public class MyTest {
    public static void main(String str[]){
        Info i=new Info();
        i.value=20;
        System.out.println("Integer value is :"+i.value);
    }
}
class Info {
    int value;
    protected Info(){
    System.out.println("Class with protected constructor");
    }
}

- >我遗漏了一些关于受保护修饰符的内容,但无法弄明白。 - >直到现在我已经读过一个带有受保护构造函数的类只能通过其子类实例化,并且也可以在同一个包或不同的包中实例化。那么为什么上面给出了这个输出:带有受保护构造函数的类          整数值为:20

3 个答案:

答案 0 :(得分:4)

因为,MyTestInfo这两个类都在同一个包中。

同一个包中的类可以毫无问题地访问受保护的成员

  

如果成员或构造函数被声明为protected,则访问权限为   只有在满足下列条件之一时才允许:

     
      
  • 从包含受保护成员或构造函数所在的类的包中发生对成员或构造函数的访问   声明。
  •   

检查JLS 6.6.2

答案 1 :(得分:2)

Protected成员可以在ClassSame packageSubclass内访问。它无权访问World(除了上面提到的)

见下表

下表显示了对每个修饰符允许的成员的访问权限。

Access Levels
Modifier      Class    Package     Subclass         World
public          Y         Y            Y              Y
protected       Y         Y            Y              N
no modifier     Y         Y            N              N
private         Y         N            N              N

答案 2 :(得分:0)

从长远来看,你会得到什么帮助,知道任何受保护的东西只能被其子类访问和操纵。这包括方法,变量等。与具有受保护构造函数的类位于同一个包中的类仍然“知道”位于构造函数中的变量。因此,您正在接收输出“具有受保护构造函数的类Integer值为:20”,因为这两个类位于同一个包中。