【问题标题】:Isn't "package private" member access synonymous with the default (no-modifier) access?“包私有”成员访问不是默认(无修饰符)访问的同义词吗?
【发布时间】:2011-07-21 22:13:05
【问题描述】:

我对某些文档使用的术语“包私有”以及“默认访问”的使用感到有些困惑。包私有和默认访问不是受保护的同义词吗?

【问题讨论】:

  • 那么,没有任何关键字来表示包私有访问?仅通过不指定访问修饰符来暗示?
  • TurtleToes,没错,这在 Java 8 中可能有点令人困惑,因为实际上可以将 default 修饰符放在(接口)方法的前面。但这不是访问修饰符!在this table 中清楚地显示了所有访问修饰符及其范围。

标签: java terminology protected access-modifiers package-private


【解决方案1】:

是的,几乎一样。 protected 修饰符指定该成员只能在其自己的包中访问(与 package-private 一样),并且此外还可以由另一个包中其类的子类访问。

【讨论】:

  • 这里有很多好的答案,但是这个解释得简单明了,所以我接受它
  • 值得注意的是,接口成员的默认访问权限是not package-private。
  • @PeterLawrey 哦?那么接口成员的默认访问权限是什么?
  • 字段的默认值为public static final,方法的默认值为public abstract,枚举或注释的默认值为public,类的默认值为public static
【解决方案2】:

“默认”访问修饰符(没有明确给出)是“package-private”,这意味着只有同一个包中的东西才能访问它们。然而,在同一个包中并不意味着类之间的继承关系——它纯粹是一种命名约定。

“受保护”意味着不仅同一个包中的类,而且子类(无论这些子类在哪个包中)都可以访问它。

【讨论】:

  • 好吧,您对受保护的措辞是错误的..相同的包类实例也可以访问受保护的成员..
【解决方案3】:

classes 的默认访问权限是包私有,但 interface 成员的默认访问权限是公共的。

例如

public interface I {
   int A = 1;
// same as
   public static final int A = 1;

   void method();
// same as
   public abstract void method();

   class C { }
// same as
   public static class C { }
}

接口的默认访问规则与类的不同。

【讨论】:

    【解决方案4】:

    包私有和默认访问是同义词。对象还可以访问其类在同一包中的对象的受保护成员。对象也可以访问其超类的受保护成员,而无需对其包的条件。举个具体的例子:

    package ab;
    
    class A {
       protected void foo() {}
       void dd(){}
    }
    
    class C {
       void aa(){
           A a = new A();
           a.foo(); //legal
           a.dd();  //legal
       }
    }
    
    
    package sub;
    
    class D extends A{
          void ac(){
             foo(); //legal ..
             dd();  //illegal.. because dd has default access.. 
          }
    
    class E {
        void ee(){
           A a = new A();
           a.foo(); //illegal
           a.dd();  //illegal     
        }
    

    【讨论】:

    • downvoter 可以解释这个解释有什么问题?...除了措辞不好......
    • 我不是反对者,但我想这是因为它不太正确;一个对象可以访问超类的受保护的成员,而与包无关。
    【解决方案5】:

    '包私有'和默认访问是一样的。在 1.1.2/3 左右的早期编译器版本中,'package' 是一个允许的修饰符,但被忽略,这意味着与没有修饰符相同,即 'package private'。不久之后,在这种情况下使用/*package*/(作为评论)出现了一种短暂的时尚。类似地,那时你可以声明同步类之类的东西,尽管同样没有实际的语义效果。

    它们都不与'protected'相同,后者扩展到其他包中的派生类。

    【讨论】:

      【解决方案6】:

      来自Java Language Spec

      • 6.6.5 示例:默认访问字段、方法和构造函数 如果 没有公开的访问修饰符, 指定了受保护的或私有的 类成员或构造函数是 可在整个包中访问 包含类的声明 在其中声明了类成员, 但类成员或构造函数是 无法在任何其他包中访问。

      如果一个公共类有一个方法或 具有默认访问权限的构造函数,然后 此方法或构造函数不是 可访问或继承 在这个包外声明的子类

      【讨论】:

      • 但是“包私有”呢。 JLS 中没有。
      【解决方案7】:

      defaultpackage-private 都是相同的,这意味着它们可以被任何类使用,直到它们在同一个包中。

      package-private 术语,实际上是由 private 修饰符的含义来命名的,因为 private 意味着它只能在同一个类中使用并且没有其他类或子类可以在同一个包内或不在同一个包内访问它。

      因此 package-private 的含义与 default 相同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-02
        • 1970-01-01
        • 2016-06-15
        • 2017-12-22
        • 2012-05-22
        • 2015-11-26
        相关资源
        最近更新 更多