Java Isn';";“私人套餐”;成员访问是否与默认(无修改器)访问同义?
我对一些文档使用的术语“包私有”以及“默认访问”的用法有点困惑。包私有和默认访问不是都是受保护的同义词吗?是的,几乎是一样的。protected修饰符指定成员只能在其自己的包内访问(与包private一样),并且除此之外,还可以由另一个包中其类的子类访问 包私有访问和默认访问是同义词。对象还可以访问其类位于同一包中的对象的受保护成员。对象还可以访问其超类的受保护成员,而无需对其包设置条件。作为一个具体例子:Java Isn';";“私人套餐”;成员访问是否与默认(无修改器)访问同义?,java,terminology,protected,access-modifiers,package-private,Java,Terminology,Protected,Access Modifiers,Package Private,我对一些文档使用的术语“包私有”以及“默认访问”的用法有点困惑。包私有和默认访问不是都是受保护的同义词吗?是的,几乎是一样的。protected修饰符指定成员只能在其自己的包内访问(与包private一样),并且除此之外,还可以由另一个包中其类的子类访问 包私有访问和默认访问是同义词。对象还可以访问其类位于同一包中的对象的受保护成员。对象还可以访问其超类的受保护成员,而无需对其包设置条件。作为一个具体例子: package ab; class A { protected void foo
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
}
“default”访问修饰符(其中没有明确给出任何一个)是“package private”,这意味着只有同一个包中的东西可以访问它们。然而,在同一个包中并不意味着类之间的继承关系——这纯粹是一种命名约定
“受保护”意味着不仅同一个包中的类,而且子类(无论这些子类在哪个包中)都可以访问它。
- 6.6.5示例:默认访问字段、方法和构造函数 没有一个访问修饰符是公共的, 指定了受保护或专用的 类成员或构造函数是 可在整个软件包中访问 包含类的声明 其中声明了类成员, 但是类成员或构造函数是 无法在任何其他包中访问
类的默认访问权限为包私有,而接口成员的默认访问权限为公共 e、 g
接口的默认访问规则与类的默认访问规则不同。'Package private'和默认访问规则相同。在早期版本的编译器1.1.2/3中,“package”是一个允许的修饰符,但被忽略,这意味着与no修饰符相同,即“package private”。不久之后,在这种情况下使用
/*package*/
(作为注释)出现了一种短暂的方式。同样,在那个时候,您可以声明类似于同步类的东西,尽管同样没有实际的语义效果
它们都不与“protected”相同,后者扩展到其他包中的派生类。default和package private都是相同的,这意味着任何类都可以使用它们,直到它们在同一个包中为止 实际上,package private术语是由private修饰符定义的,因为private意味着它只能在同一个类中使用,并且没有其他类或子类可以在同一个包内或没有包的情况下访问它
因此,package private的意思与default相同,downvoter可以解释这种解释的错误?。。除了糟糕的措辞……我不是选民,但我想这是因为它不太正确;对象可以访问超类的受保护成员,而不管包是什么。。同样的包类实例也可以访问受保护的成员。这里有很多很好的答案,但这一个简单而中肯地解释了这一点,所以我接受这一点,值得注意的是,接口成员的默认访问权限不是包私有的。@PeterLawrey Oh?那么,接口成员的默认访问权限是什么?字段的默认访问权限是
public static final
,方法的默认访问权限是public abstract
,枚举或注释的默认访问权限是public
,类的默认访问权限是public static
,因此,没有任何关键字来表示包私有访问权限?这只是因为没有指定访问修饰符?Turtleteos,没错,这在Java8中可能有点混乱,因为实际上可以将default
修饰符放在(接口)方法前面。但这不是访问修饰符!所有访问修饰符及其作用域在中都清晰可见。您也可以从中查看教程表,但“包专用”呢。这不在JLS中。
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 { }
}