“包私有”成员访问不是默认(无修饰符)访问的同义词吗?


94

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


7
因此,没有任何关键字可以表示软件包的私有访问权吗?仅通过未指定访问修饰符就可以暗示它?
TurtleToes

5
没错,TurtleToes是对的,这在Java 8中可能会有些混乱,因为实际上可以将default修饰符放在(interface)方法的前面。但这不是访问修饰符!该表中清楚地显示了所有访问修饰符及其范围。
aioobe 2015年

Answers:


136

是的,几乎一样。受保护的修饰符指定了构件只能在其自己的封装件内被访问的(与包专用)和,另外,通过其类的另一个包的子类。


这里有很多不错的答案,但是这个答案很简单,很
直率

23
值得注意的是,接口成员的默认访问权限不是 package-private。
彼得·劳瑞

1
@PeterLawrey哦?那么,接口成员的默认访问权限是什么?
ArtOfWarfare 2012年

8
一个字段的默认值为public static final,一种方法是public abstract,对于一个枚举或注释是public和一类是public static
彼得Lawrey

36

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

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


以及你对保护的写法是不对的..同一个包中的类实例也可以访问受保护的成员..
Gursel科贾

15

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

例如

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

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


3

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

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可以解释这个解释有什么问题吗?..除了措辞不好..
Gursel Koca

6
我不是拒绝投票的人,但是我想这是因为它不太正确。一个对象可以访问超类的受保护成员,而与包无关。
Adrian Petrescu

1

“包私有”和默认访问权限相同。在1.1.2 / 3左右的早期版本的编译器中,“ package”是允许使用的修饰符,但被忽略,含义与没有修饰符相同,即“ package private”。不久之后,出现/*package*/这种情况(作为评论)的短暂时机。同样,那时您可以声明诸如同步类之类的内容,尽管再次没有实际的语义影响。

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


0

Java语言规范

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

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


2
但是“打包私人”呢?那不在JLS中。
汤姆·哈特芬

-1

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

实际上,“ 包专用”一词用private修饰符的含义来称呼,因为“ 专用”意味着它仅在同一类中可用,并且没有其他类或子类可以在同一包中或没有该包中对其进行访问。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.