Java的类名与文件名必须一致(转)

原文:http://blog.csdn.net/shaoxiaoning/article/details/40424087

  • 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 方法,因为他要为自己做的东西添加运行入口,从而能方便测试。)

时间: 2024-12-11 11:15:24

Java的类名与文件名必须一致(转)的相关文章

JAVA的类名与文件名必须一至(转)

原文:http://blog.csdn.net/shaoxiaoning/article/details/40424087 1.Java保存的文件名必须与类名一致: 2.如果文件中只有一个类,文件名必须与类名一致: 3.一个Java文件中只能有一个public类: 4.如果文件中不止一个类,文件名必须与public类名一致: 5.如果文件中不止一个类,而且没有public类,文件名可与任一类名一致. 当编写一个Java源代码文件时,此文件通常被称为编译单元(有时也称为转译单元).每个编译单元都必

Java中类名与文件名的关系

1.Java保存的文件名必须与类名一致: 2.如果文件中只有一个类,文件名必须与类名一致: 3.一个Java文件中只能有一个public类: 4.如果文件中不止一个类,文件名必须与public类名一致: 5.如果文件中不止一个类,而且没有public类,文件名可与任一类名一致. 当编写一个Java源代码文件时,此文件通常被称为编译单元(有时也称为转译单元).每个编译单元都必须要有一个后缀为.java,而在编译单元内测可以 有一个public类,该类的名称必须与文件名称相同(包括大小写,但不包括文

关于Java中类名.class的基础介绍

声明:文章的总结,来自许多网友的优秀博客 关于通过类名访问class属性,我朋友过好几次了,一直没明白这个东西到底是什么?对此,我参照网友们的博客,总结了一些小知识,如发现错误,希望纠正,谢谢 其实任何一个类,都会有一个Class对象于这个类对应,在这个Class对象中,保存着实例化该类时所需要的基本信息,A.class  其实返回的是一个类A的Class对象,贴一个小代码演示一下: public class Test { /** * @param args */ public static v

java基础巩固——类名与文件名

1.java源文件名必须与类名一致. 3.一个源文件只能有一个public类 4.如果源文件中不止一个类,并且有public类,文件名必须与public类一致 5.如果源文件不止一个类,并且没有public类,文件名可以随便命名 每个编译单元只能有一个public类,否则编译 器就不会接受.如果在该编译单元之中还有额外的类的话,那么在包之外的世界是无法看见这些类的,这是因为他们不是public类,而且他们主要用来为主要 public类提供支持. 如果源文件包含多个类,经过编译后,每个类会生成一个

Java 获得运行时文件名,类名,方法名,行号

package com.someorg; public class Logger { public static void info(String something) { int lineNo = getCurrentLineNumber(); String methodName = getCurrentMethodName(); String className = getCurrentClassName(); System.out.println(className + "."

Java 获取类名,函数名,行数

C++下用宏来实现.分别是__FILE__,__func__,__LINE__分别代表,C++编译自动在每个文件中设定__FILE__类型是字符串常量 ,将__LINE__替换为当前行数,类型是数字常量,将在每个函数设定__FUNC__类型是字符串常量. JAVA下用StackTraceElement类 : String getFileName() 返回文件名 int getLineNumber()返回当前行数 String getClassName()返回类名 String getMethod

java中类名.class, class.forName(), getClass()区别

Class对象的生成方式如下: 1.类名.class           说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象 2.Class.forName("类名字符串")  (注:类名字符串是包名+类名)  说明:装入类,并做类的静态初始化,返回Class的对象 3.实例对象.getClass()  说明:对类进行静态初始化.非静态初始化:返回引用o运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)

java中类名.class、实例.getclass()区别

1 import java.util.HashSet; 2 import java.util.Iterator; 3 4 /** 5 * Created by GOD on 2016/1/23. 6 * Class对象的生成方式如下: 7 1.类名.class 说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象 8 2.Class.forName("类名字符串") (注:类名字符串是包名+类名) 说明:装入类,并做类的静态

Java POI Excel导出文件名中文乱码

在导出前对名称根据浏览器做下处理 // 判断浏览器类型,firefox浏览器做特殊处理,否则下载文件名乱码 public static void compatibleFileName(HttpServletRequest request, HttpServletResponse response, String excelname) throws UnsupportedEncodingException { String agent = request.getHeader("USER-AGENT