Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Isn';";“私人套餐”;成员访问是否与默认(无修改器)访问同义?_Java_Terminology_Protected_Access Modifiers_Package Private - Fatal编程技术网

Java Isn';";“私人套餐”;成员访问是否与默认(无修改器)访问同义?

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

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

是的,几乎是一样的。protected修饰符指定成员只能在其自己的包内访问(与包private一样),并且除此之外,还可以由另一个包中其类的子类访问

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

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”相同,后者扩展到其他包中的派生类。

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