我对某些文档使用的术语“包私有”以及“默认访问”的使用感到有些困惑。包私有和默认访问都不是受保护的同义词吗?
答案 0 :(得分:131)
是的,几乎是一样的。 protected修饰符指定只能在其自己的包中访问该成员(与package-private一样),并且另外,只能在另一个包中通过其类的子类访问。
答案 1 :(得分:32)
“默认”访问修饰符(没有明确给出它们的那个)是“package-private”,这意味着只有同一个包中的东西才能访问它们。但是,在同一个包中并不意味着类之间的继承关系 - 它纯粹是命名约定。
“受保护”意味着不仅同一个包中的类,而且子类(无论这些子类在哪个包中)都能够访问它。
答案 2 :(得分:14)
类的默认访问权限是package-private,但接口成员的默认访问权限是公开的。
e.g。
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 :(得分: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
}
答案 4 :(得分:1)
'包私有'和默认访问是相同的。在1.1.2 / 3左右的编译器的早期版本中,'package'是一个允许的修饰符,但被忽略,意味着与no修饰符相同,即'package private'。不久之后,在这种情况下放置/*package*/
(作为评论)有一种短暂的时尚。同样,那时你可以声明像synchronized类这样的东西,虽然没有实际的语义效果。
它们都不与'protected'相同,后者扩展到其他包中的派生类。
答案 5 :(得分:0)
- 6.6.5示例:默认访问字段,方法和构造函数如果 没有任何访问修饰符公开, 指定了protected或private,a 类成员或构造函数是 整个包装都可以访问 包含类的声明 在其中声明类成员, 但是类成员或构造函数是 任何其他包裹都无法访问。
如果公共类有方法或 那么具有默认访问权限的构造函数 这个方法或构造函数不是 可以访问或继承的 在此包之外声明的子类
答案 6 :(得分:-1)
默认和 package-private 两者都相同,这意味着任何类都可以使用它们,直到它们位于同一个包中。
package-private 这个术语实际上被称为私有修饰符的含义,因为私有意味着它仅在同一个类中可用并且没有其他类或子类可以在同一个包中访问它或没有。
因此 package-private 与默认相同。