javac使用默认的访问修饰符编译类,即使文件名不同

javac使用默认的访问修饰符编译类,即使文件名不同,java,javac,Java,Javac,为什么javac即使文件名不同也会编译带有默认修饰符的类?为什么当访问修饰符为public、private或protected时不会编译? 例如:文件名:Test 文件内容 类foo{} 它被编译时不会出错,如果我在类前面添加public、private或protected,它就不会被编译,有人能解释为什么它会如此有两条规则吗 如果将类型声明为public,则文件名应为相同类型,可以是类或接口 不能有私有类或受保护类外部类 第一点的原因是,这是定义java规范的方式。 您不能将外部类声明为p

为什么javac即使文件名不同也会编译带有默认修饰符的类?为什么当访问修饰符为public、private或protected时不会编译? 例如:文件名:Test 文件内容 类foo{}

它被编译时不会出错,如果我在类前面添加public、private或protected,它就不会被编译,有人能解释为什么它会如此

有两条规则吗

  • 如果将类型声明为
    public
    ,则文件名应为相同类型,可以是
    接口
  • 不能有
    私有类
    受保护类
    外部类
第一点的原因是,这是定义java规范的方式。 您不能将外部类声明为private,因为它根本不起任何作用

  • 源文件中可以有任意类型的as,但只能有一个公共类型,如果有公共类型,则文件名必须与公共类型匹配

java的创建者有没有理由在类带有默认修饰符的情况下给出一个例外?因为类必须在包中可见<代码>默认值访问级别意味着它们在该包中可见。我问他们为什么在文件名的情况下对带有默认修饰符的类给出例外