96

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

4

7 回答 7

138

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

于 2011-03-24T07:37:20.063 回答
36

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

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

于 2011-03-24T07:37:54.597 回答
16

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

例如

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 { }
}

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

于 2011-03-24T09:00:00.400 回答
2

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

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     
    }
于 2011-03-24T07:37:51.133 回答
1

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

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

于 2012-10-11T08:17:44.550 回答
0

来自Java 语言规范

  • 6.6.5 示例:默认访问字段、方法和构造函数如果没有指定访问修饰符 public、protected 或 private,则类成员或构造函数可在包含类声明的包中访问,该类在其中声明了成员,但在任何其他包中都无法访问类成员或构造函数。

如果公共类具有具有默认访问权限的方法或构造函数,则此方法或构造函数不能被在此包外声明的子类访问或继承

于 2011-03-24T07:47:04.937 回答
-1

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

实际上,包私有术语被称为私有修饰符的含义,因为私有意味着它仅在同一个类中可用,并且没有其他类或子类可以在同一个包内或不在同一个包内访问它。

因此package-private意味着与default相同。

于 2016-06-23T09:14:50.693 回答