同一.java文件中任何其他顶级类的可访问性是什么?

时间:2017-11-03 03:52:27

标签: java

我听说.java文件只能有一个公共顶级类。

同一.java文件中任何其他顶级类的可访问性必须是private还是protected

为什么

public class MyClass {
    public static void main(String args[]) {
    }
}

 private class C{}

有错误

/MyClass.java:6: error: modifier private not allowed here
 private class C{}
         ^
1 error

感谢。

3 个答案:

答案 0 :(得分:2)

Java文件只能包含一个顶级类,这意味着您可以 嵌套 类。您目前正在尝试创建两个顶级类。嵌套类看起来像,

public class MyClass {
    public static void main(String args[]) {
    }
    private class C{}
}

名称为MyClass.C(此处MyClass为顶级类,C为内部类)。对于顶级类,源文件名必须与顶级类的声明名称匹配。这与C语言不同,C语言不强制执行源文件的命名方案。

@Erwin Bolwidt中指出comments,你可以(虽然这不是一个坏主意)

public class MyClass {
    public static void main(String args[]) {
    }
}
class C{}

但只有与MyClass相同的包中的类才能访问它。

答案 1 :(得分:2)

  

同一.java文件中任何其他顶级类的可访问性必须是private还是protected

显然不是,因为您的问题编译错误已经告诉您private对顶级课程无效。

Java语言规范7.6 Top Level Type Declarations回答了您的问题:

  

如果没有访问修饰符,则顶级类型具有包访问权限:只能在声明它的包的编译单元中访问它(§6.6.1)。可以声明类型public以从其他包中的代码授予对该类型的访问权。

     

如果顶级类型声明包含以下任一访问修饰符,则为编译时错误:protectedprivatestatic

因此,对于顶级课程,privateprotected都不是允许的

规范继续说:

  

当且仅当包存储在文件系统(§7.2)中时,如果在a下的文件中找不到类型,主机系统可以选择强制执行编译时错误的限制。如果满足以下任一条件,则名称由类型名称加上扩展名(例如.java.jav)组成:

     
      
  • 该类型由声明类型的包的其他编译单元中的代码引用。

  •   
  • 该类型声明为public(因此可以从其他包中的代码访问)。

  •   
     

此限制意味着每个编译单元最多只能有一个这样的类型。这种限制使Java编译器可以轻松地在包中找到命名类。在实践中,许多程序员选择将每个类或接口类型放在它自己的编译单元中,无论它是公共的还是由其他编译单元中的代码引用。

如您所见,public顶级类的名称必须与源文件相同。当然,每个文件只能有一个public顶级类。

任何非public顶级类必须是通常所说的 package-private ,即它必须没有访问修饰符。

访问修饰符在Chapter 6. Names中定义:

  

如果没有访问修饰符,大多数声明都有包访问,允许访问包含其声明的包中的任何位置;其他可能性包括publicprotectedprivate

答案 2 :(得分:1)

内部类可以有任何访问修饰符,但外部类只能有public或default修饰符。

例如: - public class Aclass A

要了解有关Java中访问修饰符的更多信息,您可以查看此链接In Java, difference between default, public, protected, and private