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


当前回答

官方教程可能对您有所帮助。


Class Package Subclass
(same pkg)
Subclass
(diff pkg)
World
public + + + + +
protected + + + +
no modifier + + +
private +

+:可访问空白:不可访问

其他回答

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();
  }
}

输出:您好

当你想到访问修饰符时,你可以这样想(适用于变量和方法):

public-->可从任何位置访问private-->只能在声明它的同一类中访问

现在,当涉及到默认和受保护时,就会出现混乱

默认-->不存在访问修饰符关键字。这意味着它严格在类的包中可用。在该包之外,任何地方都无法访问。

protected-->略低于默认值,并且除了相同的包类之外,它可以由声明的包之外的子类访问。

Public Protected Default和private是访问修饰符。

它们用于封装,或隐藏和显示类的内容。

类可以是公共的或默认的类成员可以是公共的、受保护的、默认的或私有的。

课堂外无法访问私人课程默认值只能在包中访问。在包以及扩展它的任何类中受到保护。公众对所有人开放。

通常,成员变量被定义为私有的,但成员方法是公共的。

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

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

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

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

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

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

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

注:这只是对公认答案的补充。

这与Java访问修改器有关。

从Java访问修改器:

Java访问修饰符指定哪些类可以访问给定的类及其字段、构造函数和方法。访问修饰符可以为类、其构造函数、字段和方法。Java访问修饰符有时也在日常使用中使用语音作为Java访问说明符,但正确的名称是Java访问修改器。类、字段、构造函数和方法可以具有四种不同的Java访问修饰符:列表项目私有的默认(包)受保护的平民的

从控制对班级成员的访问教程:

访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法。有两个级别访问控制:在顶层public或package private(没有显式修饰符)。在成员级别public、private、protected或package private(没有显式修饰符)。类可以用修饰符public声明,在这种情况下类对任何地方的所有类都可见。如果类没有修饰符(默认值,也称为包专用),它仅可见在其自己的包装内下表显示了每个成员允许的成员访问权限修改器。╔═════════════╦═══════╦═════════╦══════════╦═══════╗║ 修改器║ 班║ 包裹║ 子类║ 世界║╠═════════════╬═══════╬═════════╬══════════╬═══════╣║ 平民的║ Y║ Y║ Y║ Y║║ 受保护的║ Y║ Y║ Y║ N║║ 无修饰符║ Y║ Y║ N║ N║║ 私有的║ Y║ N║ N║ N║╚═════════════╩═══════╩═════════╩══════════╩═══════╝第一个数据列指示类本身是否有权访问由访问级别定义的成员。正如你所看到的,一个班级总是可以访问自己的成员。第二列指示是否类(无论其父母)有权访问该成员。第三列表示在该包外部声明的类的子类是否具有访问该成员。第四列指示是否所有类可以访问该成员。访问级别以两种方式影响您。首先,当您使用来自另一个源,访问级别决定您自己的这些类的哪些成员类可以使用。第二,当你写一门课时,你需要决定类中每个成员变量和每个方法的访问级别应该有。