当前位置: 首页 > 面试题库 >

为什么Java文件必须与公共类具有相同的名称?

曾骁
2023-03-14
问题内容

我有一个名为的文件temp.java。我写了下面的代码。为什么这样做?

class demo //not public keyword and not same as filename
{
    public static void main(String []args)
    {
        System.out.println("this is Main method");
    }
}

为什么这不起作用?

public class demo
{
    public static void main(String []args)
    {
        System.out.println("this is Main method");
    }
}

问题答案:

在第一个示例中,您的类实际上被声明为“包私有”(没有修饰符),这意味着只有同一包中的类才能访问它。在第二个示例中,您已将其声明为public。

在这种情况下,编译器已经很好地满足了JLS。

JLS指出:

当程序包存储在文件系统中时(第7.2.1节),如果在文件中找不到由类型名加类型组成的名称的文件中的类型,则主机系统可能会选择强制实施限制,即编译时错误。如果满足以下任一条件,则为扩展名(例如.java或.jav):

  • 该类型由声明该类型的包的其他编译单元中的代码引用。
  • 该类型被声明为public(因此可以从其他包中的代码访问)。
    这种限制意味着每个编译单元最多只能有一个这样的类型。这种限制使Java编程语言的编译器或Java虚拟机的实现可以轻松地在包中查找命名的类。例如,可以在目录wet / sprocket的Toad.java文件中找到公共类型wet.sprocket.Toad的源代码,并在同一目录的Toad.class文件中找到相应的目标代码。

对于方案1,这意味着,因为只有temp.java包私有类demo,所以在包的任何其他编译单元中,代码都未引用它,因此它将毫无问题地进行编译。

第二种情况已将类声明为public-这意味着可以从其他包中的代码访问该类-因此它必须符合类名等于文件名的标准。

如果您在第一个场景中(在同一程序包中)创建了另一个类,然后尝试引用该类demo,则应该得到编译错误。



 类似资料:
  • 问题内容: 在Java中,文件名应与该文件中包含的文件名相同。为什么会有限制?它有什么作用? 问题答案: Java有一个有趣的方法:给程序员一个选择只能降低编程经验,而不必选择。 他们在很多地方都这样做。确保使用文件名和软件包,但不允许在文件中使用多个公共类(从来没有),不允许您在文件之间拆分类(该死,很难使用!),等等。 我真的希望他们走得更远。没有理由使用公共变量:我从来不需要一个变量,也从未

  • 本文向大家介绍为什么Java文件名应始终与公共类名相同?,包括了为什么Java文件名应始终与公共类名相同?的使用技巧和注意事项,需要的朋友参考一下          在Java中,java文件名应始终与公共类名相同。 首先编写Java程序时,它会保存为“ .java ”文件,编译时会形成字节代码,即“ .class ”文件,这样,如果我们使程序文件与该类相似,就会感到很舒服。让我们毫无歧义地理解。

  • 问题内容: 我对C#非常熟悉,但是开始在Java中工作更多。我希望了解到Java中的枚举基本上与C#中的枚举等效,但是显然并非如此。最初,我很高兴得知Java枚举可以包含多条数据,这似乎非常有利(http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html)。但是,从那时起,我发现了很多C#缺少的功能,例如能够轻松地将枚举元素分配给某个值

  • 我知道这个主题在这里讨论了很多次,但我仍然坚持一个例外:外键必须与引用的主键具有相同的列数。 (我正在使用spring数据和hibernate) 我的身份证类别: 我的实体: 对于这种构造,我得到以下例外情况: 导致:org.hibernate.MappingException:外键(FK_ad3h9gu4labg6ix34bei3poxt:proxy_dienst_关系[parent_diens

  • 问题内容: 在以下代码中,我不明白为什么当它属于两个不同的对象时具有相同的ID? 问题答案: 我认为这是正在发生的事情: 取消引用时,将在内存中创建其副本。该存储位置由以下位置返回 由于没有引用到刚刚创建的方法的副本,因此GC将其回收,并且该内存地址再次可用 取消引用时,将在相同的内存地址(可用)中创建它的副本,您可以再次使用该地址。 第二个副本是GCd 如果您要运行一堆其他代码并再次检查实例方法

  • Java不允许通过更改子类的返回类型来重写方法,有什么特别的原因吗? 由于返回类型不是方法签名的一部分,编译器不认为具有不同返回类型(但具有相同名称、相同数量和类型的参数)的方法是相同的吗?