在Java中,在创建类和接口以及处理继承时,是否有明确的规则来确定何时使用每个访问修饰符,即默认的(包私有)、公共的、受保护的和私有的?


当前回答

此页很好地描述了受保护的默认访问修饰符(&D)

....受保护:受保护的访问修饰符有点棘手,可以说是默认访问修饰符的超集。就同一包中的访问而言,受保护的成员与默认成员相同。不同的是,受保护的成员也可以访问声明成员的类的子类,这些子类位于父类所在的包之外。

但是,这些受保护的成员“只能通过继承在包外部访问”。即,您可以直接访问某个类的子类中的受保护成员,就像该成员存在于子类本身中一样。但是,通过使用父类的引用,该受保护成员在包外部的子类中将无法访问。....

其他回答

Java中的访问修饰符。

Java访问修饰符用于在Java中提供访问控制。

1.默认值:

只能访问同一包中的类。

例如

// Saved in file A.java
package pack;

class A{
  void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B{
  public static void main(String args[]){
   A obj = new A(); // Compile Time Error
   obj.msg(); // Compile Time Error
  }
}

这种访问比公共访问受到更多的限制和保护,但比私人访问受到更少的限制。

2.公众

可以从任何地方访问。(全球访问)

例如

// Saved in file A.java

package pack;
public class A{
  public void msg(){System.out.println("Hello");}
}

// Saved in file B.java

package mypack;
import pack.*;

class B{
  public static void main(String args[]){
    A obj = new A();
    obj.msg();
  }
}

输出:您好

3.私人

只能在同一类中访问。

如果您试图访问另一个类中一个类的私有成员,将引发编译错误。例如

class A{
  private int data = 40;
  private void msg(){System.out.println("Hello java");}
}

public class Simple{
  public static void main(String args[]){
    A obj = new A();
    System.out.println(obj.data); // Compile Time Error
    obj.msg(); // Compile Time Error
  }
}

4.受保护

只能访问同一包中的类和子类

例如

// Saved in file A.java
package pack;
public class A{
  protected void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B extends A{
  public static void main(String args[]){
    B obj = new B();
    obj.msg();
  }
}

输出:您好

简而言之

公共:随处可见。protected:可由同一包的类和驻留在任何包中的子类访问。默认(未指定修饰符):可由同一包的类访问。private:只能在同一类中访问。

这一切都是关于封装的(或者正如乔·菲利普斯所说的,最起码的知识)。

从限制性最大的(私有)开始,看看以后是否需要限制性较小的修饰符。

我们都使用方法和成员修饰符,如private、public、。。。但很少有开发人员会做的一件事是使用包来逻辑地组织代码。

例如:您可以将敏感的安全方法放在“安全”包中。然后放一个公共类,它访问这个包中的一些安全相关代码,但保持其他安全类包的私有性。因此,其他开发人员只能在这个包之外使用公开可用的类(除非他们更改了修饰符)。这不是安全功能,但将指导使用。

Outside world -> Package (SecurityEntryClass ---> Package private classes)

另一件事是,相互依赖性很强的类最终可能会出现在同一个包中,如果依赖性太强,最终可能会被重构或合并。

相反,如果您将所有内容都设置为公共,则不清楚哪些内容应该访问或不应该访问,这可能会导致编写大量javadoc(它不会通过编译器强制执行任何内容…)。

____________________________________________________________________
                | highest precedence <---------> lowest precedence
*———————————————+———————————————+———————————+———————————————+———————
 \ xCanBeSeenBy | this          | any class | this subclass | any
  \__________   | class         | in same   | in another    | class
             \  | nonsubbed     | package   | package       |    
Modifier of x \ |               |           |               |       
————————————————*———————————————+———————————+———————————————+———————
public          |       ✔       |     ✔     |       ✔       |   ✔  
————————————————+———————————————+———————————+———————————————+———————
protected       |       ✔       |     ✔     |       ✔       |   ✘   
————————————————+———————————————+———————————+———————————————+———————
package-private |               |           |               |
(no modifier)   |       ✔       |     ✔     |       ✘       |   ✘   
————————————————+———————————————+———————————+———————————————+———————
private         |       ✔       |     ✘     |       ✘       |   ✘    
____________________________________________________________________

我的两分钱:)

私人:

class->顶级类不能是私有的。内部类可以是私有的,可以从同一类访问。

实例变量->只能在类中访问。无法在类外部访问。

包专用:

class->顶级类可以是包专用的。它只能从同一个包访问。不是来自子包装,不是来自外包装。

实例变量->可从同一包访问。不是来自子包装,不是来自外包装。

受保护的:

class->无法保护顶级类。

实例变量->只能在同一包或子包中访问。扩展类时只能在包外部访问。

公众:

类->可从包/子包/另一个包访问

实例变量->可从包/子包/另一个包访问

下面是详细的答案

https://github.com/junto06/java-4-beginners/blob/master/basics/access-modifier.md