Java的类名与文件名必须一致

转载 2016年08月30日 20:46:06

初学java,遇到一个问题,我的java保存的文件名与类名不一致,无法编译,如下所示。按照作者说的 如果有一个public class类,就应该让文件名和此类名相同;那如果没有呢,即所有的 class 都没有修饰符,那么可以给该文件随便起名字,甚至可以不和任意一个类同名,哪怕是汉字名称都可以,但是后缀还是要有.java 的 。我的程序是没有public类的

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

		System.out.println("Hello World!");
	}
}
此外,假如我把文件名和类名均改为sss,编译运行后,再将类名改为kjs,发现又能够编译运行了。在文件夹中发现是有kjs.class文件的。奇怪的问题?先记下来



1.Java保存的文件名必须与类名一致;
2.如果文件中只有一个类,文件名必须与类名一致;
3.一个Java文件中只能有一个public类;
4.如果文件中不止一个类,文件名必须与public类名一致;
5.如果文件中不止一个类,而且没有public类,文件名可与任一类名一致。

     当编写一个Java源代码文件时,此文件通常被称为编译单元(有时也称为转译单元)。每个编译单元都必须要有一个后缀为.java,而在编译单元内测可以 有一个public类,该类的名称必须与文件名称相同(包括大小写,但不包括文件的后缀名.java)。每个编译单元只能有一个public类,否则编译 器就不会接受。如果在该编译单元之中还有额外的类的话,那么在包之外的世界是无法看见这些类的,这是因为他们不是public类,而且他们主要用来为主要 public类提供支持。

    1. 每个编译单元(文件)都只能有一个public类。这表示,每个编译单元都有单一的公共接口,用public类来表现。该接口可以按要求包含众多的支持包访问权限的类。如果在某个编译单元内有一个以上的public类,编译器就会给出出错信息。

    2. public类的名称必须完全与含有该编译单元的文件名相匹配,包括大小写。所以对于Widget而言,文件的名称必须是Widget.java,而不是widget.java或WIDGET.java。如果不匹配,同样将得到编译时错误。

    3. 虽然不是很常用,但编译单元内完全不带public类也是可能的。这种情况下,可以随意对文件命名。(尽管随意命名会使得人们在阅读和维护代码时产生混淆。)

     一个Java文件可以有多个类作为内部类/Adapter类/其它类,但是只能有一个public类,且类名必须和文件名一致。这是这类语言的一个不好的地方。

     在现实情况中,经常有一些很小的类由几个类共同需要,因此无法作为内部类,而且接口关系必须设置为public,这样就导致了大量很小的.Java程序,每个都只有几百字节。

     这类语言的另一个问题是一个类的所有实现的方法都必须包含在同一个文件中。在swing应用程序中,经常导致长达一两百K字节的源程序,行数达到三四千行,搞得JBuilder奇慢无比。

    一个 .java 文件,可以有多个类,但是文件名只能有一个,用哪一个类名来充当文件名呢?其实文件名是无所谓的,因为将来用 javac 进行编译的时候,最终会生成多个 .class 文件,每一个类对应个 .class 文件。运行时只要运行对应的 .class 文件就可以了,这时 .java 文件就显得没什么用了( 运行时不需要 ),那还管它叫什么名字。

    但是当你的类被 public 修饰时,此时文件名必须和该类保持一致(例如 public class A{} 只能放在 A.java 文件中,不然在用 javac 编译时会提示错误:类 A 是公共的,应在名为 A.java 的文件中声明)。也就是说在同一个 .java 文件中,不应该出现2个或2个以上的 public class 。

    如果有一个public class类,就应该让文件名和此类名相同;那如果没有呢,即所有的 class 都没有修饰符,那么可以给该文件随便起名字,甚至可以不和任意一个类同名,哪怕是汉字名称都可以,但是后缀还是要有.java 的  。

    注:有很多初学者 ( 我也是 ) 可能会认为文件名应该也和 main 方法所在类有关系,其实不然。main 方法只是程序的一个入口,老师讲“一个程序只能有一个入口”,好象是在说只能有一个 main 方法,其实,只要你高兴,就可以在所有类里都写上 main 方法,给程序提供N多个入口,但是最后你运行程序的时候也只能从其中的一个入口进去,这就是 main 的作用( 程序入口 )。(这也就是为什么你会发现,程序员在做单元测试时,会往自己做的很多类里面添加 main 方法,因为他要为自己做的东西添加运行入口,从而能方便测试。)

Java的类名与文件名必须一致

1.Java保存的文件名必须与类名一致; 2.如果文件中只有一个类,文件名必须与类名一致; 3.一个Java文件中只能有一个public类; 4.如果文件中不止一个类,文件名必须与public类...
  • shaoxiaoning
  • shaoxiaoning
  • 2014年10月24日 10:48
  • 23593

java中文件名必须和类名一致吗

1.Java保存的文件名必须与类名一致; 2.如果文件中只有一个类,文件名必须与类名一致; 3.一个Java文件中只能有一个public类; 4.如果文件中不止一个类,文件名必须与public类...
  • s1491695565
  • s1491695565
  • 2015年12月08日 17:56
  • 687

C#源文件名不一定要和C#源文件中包含的类名相同

和Java不一样,C#源文件名不一定要和C#源文件中包含的类名相同。 C#对大小写敏感,所以Main的首字母为大写的M(这一点大家要注意,尤其是熟悉C语言的朋友)。 你可以定义一个返回值为int的...
  • ershouyage
  • ershouyage
  • 2012年06月21日 09:42
  • 1677

JAVA的类名与文件名必须一致

1.Java保存的文件名必须与类名一致; 2.如果文件中只有一个类,文件名必须与类名一致; 3.一个Java文件中只能有一个public类; 4.如果文件中不止一个类,文件名必须与public类...
  • fukaibo121
  • fukaibo121
  • 2015年07月24日 15:18
  • 265

Java编译单元为什么只能有一个public类,而且源文件名必须要与类名相同

在一个java源文件当中可以有多个类,但是为什么只能有一个public类呢?而当这个类被修饰为public的话,为什么源文件名必须要与类名相同呢?  Java编程思想中的一段话: 当编写一个ja...
  • WaitForFree
  • WaitForFree
  • 2016年04月01日 01:10
  • 3654

mybatis和springmvc整合

上篇博文我们介绍了mybatis的基本概念与原理,这篇博文我们通过spring与Mybatis集成,开发一个简单用户增删改查的Web项目。   基本准备工作   1、安装JDK1.6以上版本,...
  • BeyondLCG
  • BeyondLCG
  • 2017年04月09日 11:26
  • 195

java的类名、文件名、包名

1.Java保存的文件名必须与类名一致; 2.如果文件中只有一个类,文件名必须与类名一致; 3.一个Java文件中只能有一个public类; 4.如果文件中不止一个类,文件名必须与public类名一致...
  • btqszl
  • btqszl
  • 2017年03月24日 12:10
  • 611

java源文件当中可以有多个类,但是为什么只能有一个public类呢? 当类被修饰为public的话,为什么源文件名必须要与类名相同呢?

解析: 1、只有一个public类: 第一、每个编译单元(文件)只能有一个public 类。这么做的意思是,每个编译单元只能有一个公开的接口,而这个接口就由其public 类来表示。 第二、ja...
  • u013594414
  • u013594414
  • 2014年02月20日 16:18
  • 2096

Java为什么一个源文件只能有一个public类,而且源文件名必须要与public类名相同

看了几个解答,都不能让我很满意,以后有机会再深究一下,真要是被问起,就这么答:java和jvm的设计需要,是一个规定.假如一个源文件中没有public类,那么你想定义几个类就定义几个,都没有问题,而且...
  • Code_My_Life
  • Code_My_Life
  • 2016年05月27日 09:58
  • 2383

关于PYTHON一个低级错误(py文件名和库名重复)

好久不coding,使用pycharm时,将自己的py文件命名为了IPy.py 然后from IPy import IPSet,IP 反馈错误: "IPY" ImportError: cannot...
  • guotch
  • guotch
  • 2017年11月24日 18:41
  • 145
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java的类名与文件名必须一致
举报原因:
原因补充:

(最多只允许输入30个字)