`public class`和`class`之间有什么区别?

我注意到如果不在类之前写public ,它的工作方式与public class相同。 我不明白为什么会这样? 当我不将类声明为publicprivateprotected时,它应该显示错误。 但它运作正常。 是什么原因?

publicprotectedprivate是访问修饰符。 公共意味着主题可以被任何类访问,受子类保护,类本身私有,没有修饰符意味着“包受保护”,因此主题可以由来自同一包的类访问。

主题是类,方法,成员变量。

我注意到如果不在类之前写公共,它的工作方式与公共类相同。

不,不。 除非它是公开的,否则对于不在同一个包中的其他代码,该类将不可见。 默认可访问性(无法明确指定)是类(或其他成员)仅对同一包中的其他代码可见。

您应该阅读Java语言规范部分6.6和Java教程(控制对类成员的访问)以获取更多详细信息。

默认情况下,类是package private的(如此处所述),因此它的行为方式不同。 你只是认为这是因为你没有尝试从不同的包中使用你的类。

每个.java源文件必须只有一个公共类,文件名必须与此公共类匹配。

类似的问题在SO之前被问到。 请在这里找到它

对于类的声明,只能使用两个关键字:

  • public 。例如:公共class学生{// …}
  • 私有包(默认情况下)。例如:class Note {// …}。它只在他的包中可见。

只有在类中声明成员时,才可以使用private和protected。 例:

 public class Student{ protected Note note; } 

如果您没有提供访问修饰符,则默认为包私有访问。 该课程无法在课程外进行访问。 理想情况下,JLS应该包含一个用于包访问的关键字,以避免混淆和意外后果。

就像是,

 default class Student{} 

它的工作原理相同,因为您只使用一个文件并在同一个包中。

如果您有多个包,那么您就遇到了问题。 在类名称之前没有“public”的类不能在另一个包中创建。 你不能使用它的构造函数。 您无法在创建该类的包之外访问它。