【问题标题】:Instansiating a class with protected constructor使用受保护的构造函数实例化一个类
【发布时间】:2014-04-22 10:42:25
【问题描述】:
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

【问题讨论】:

  • 您的 Info 类和 MyTest 位于同一个包中。并且protected 修饰符具有包可见性。尝试将Info 移动到不同的包中,以获取相同语句的错误。

标签: java protected access-modifiers


【解决方案1】:

从长远来看,您将帮助您了解任何受保护的内容只能由其子类访问和操作。这包括方法、变量等。与具有受保护构造函数的类位于同一包中的类仍然“知道”位于构造函数中的变量。因此,您会收到输出“Class with protected constructor Integer value is :20”,因为这两个类在同一个包中。

【讨论】:

    【解决方案2】:

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

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

    如果成员或构造函数被声明为受保护,那么访问是 仅当满足以下条件之一时才允许:

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

    查看JLS 6.6.2

    【讨论】:

      【解决方案3】:

      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
      

      【讨论】:

      • 比你,我错过了两者都在同一个包内的观点
      猜你喜欢
      • 2013-10-06
      • 1970-01-01
      • 2016-01-26
      • 1970-01-01
      • 2017-01-09
      • 2011-10-23
      • 1970-01-01
      • 2011-05-30
      • 2010-11-15
      相关资源
      最近更新 更多