是不是“包私人”成员访问与默认(无修饰)访问的代名词?
我对一些文档使用的“package private”一词有点困惑,以及“default access”的使用。 不是包私有和默认访问两个同义的保护?
是的,这几乎是一样的。 受保护的修饰符指定该成员只能在其自己的包内访问(与包私有一样), 另外还可以在另一个包中访问该类的子类。
“默认”访问修饰符(它们都没有明确给出)是“package-private”,这意味着只有同一个包中的东西才能访问它们。 然而,在同一个软件包中,对类之间的inheritance关系没有任何意义 – 这完全是一个命名约定。
“受保护的”意味着不仅是同一个包中的类,还有子类(不pipe这些子类在哪个包中)将能够访问它。
类的默认访问是package-private,但是接口成员的默认访问是公共的。
例如
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 { } }
接口的默认访问规则与类不同。
包私有和默认访问是同义词。 一个对象也可以访问类在同一个包中的对象的protected成员。 一个对象也可以访问其超类的受保护成员,而没有关于它的包的条件。 作为一个具体的例子:
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 }
“包私人”和默认访问是相同的。 在1.1.2 / 3左右的编译器的早期版本中,'package'是一个允许的修饰符,但被忽略,意思就是没有修饰符,即'package private'。 不久之后,在这种情况下,就有了一种短暂的时尚方式来把/*package*/
(作为评论)。 同样的,在那个时候你可以声明类似的同步类,尽pipe再没有实际的语义效果。
它们都不是“protected”,它被扩展到其他包中的派生类。
从Java语言规范
- 6.6.5示例:默认访问字段,方法和构造函数如果没有指定任何访问修饰符public,protected或private,则可以在整个包中访问类成员或构造函数,其中包含类的声明成员声明,但类成员或构造函数不能在任何其他包中访问。
如果公共类具有默认访问的方法或构造函数,则此方法或构造函数不能被此包之外声明的子类访问或inheritance
默认和package-private都是相同的,这意味着两者都可以被任何类使用,直到它们在同一个包中。
实际上, 包私有术语被称为私有修饰符的含义,因为私有术语仅在同一类中可用,并且其他类或子类不能在同一包中或不在同一包中访问它。
因此package-private与default相同。