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

Java编程思想中的一段话:

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

理解:

每编写一个Java文件就是Java编译器编译Java源代码的一个编译单元,具体怎么编译呢?这个就需要去了解Java编译器的工作原理了。编译器每编译一个.java文件(编译单元),对应着.java文件中的每个类都会有一个输出文件,而该输出文件的名称与.java文件中每个类的名称相同,只是多了一个后缀名.class。因此,在编译少量.java文件之后,会得到大量的.class文件。在.java文件中,不是必须含有public类的。public类只是用来表示编译单元中存在公开接口。

但如果含有public类,最多只能有一个,必须名字和文件名一样。因为编译的时候Java编译器会判断如果存在public类,该类当作这个编译单元的对外接口,类加载器需要把该类加载。对于一个public类,它是可以被项目中任何一个类所引用的,只需在使用它前import一下它所对应的class文件即可,将类名与文件名一一对应就可以方便虚拟机在相应的路径(包名)中找到相应的类的信息。如果不这么做的话,就很难去找,而且开销也会很大。运行的时候则是调用main()函数运行的。

个人总结:

1、Java编译器在编译的时候,如果整个Java文件(编译单元)都没有public类(对外的公开接口类),类加载器子就无需从这方面直接去加载该编译单元产生的所有的字节码文件(.class文件),那么也就是无需去寻找编译后字节码文件存放位置。而类名和文件名一致是为了方便虚拟机在相应的路径中找到相应的类所对应的字节码文件。所以在没有public类的Java文件中,文件名和类名都没什么联系。

2、如果编译单元中包含了public类,那么该类对应的字节码文件当需要被类加载器加载的,这时候就需要让类加载器知道该字节码文件的位置,所以就要确保该类与Java文件名称一致。同时,如果有两个public类在同一个文件中,而一个文件只能有一个名称,故两个public类的名称就不能同时和文件名一样,这就造成至少其中有一个public类在编译的时候编译不通过,产生类似的提示

3补充一点:如果一个public类的内部类存在的话,那么会生成otherClass&InnerClass.class文件,其实就是为了识别内部类.

java解释器的运行过程如下:首先,找出环境变量CLASSPATH(可以通过操作系统来设置,有时也可通过安装程序-用来在你的机器上安装java或者基于java的工具-来设置)。CLASSPATH包含一个或多个目录,用作查找.class文件的根目录。从根目录开始,解释器获取包的名称并将每个句点替换成反斜杠,以从CLASSPATH根中产生一个路径名称(于是,package foo.bar.baz就变成了foo\bar\baz或foo/bar/baz或其他,这一切取决于操作系统)。得到的路径会与CLASSPATH中的各个不同的项相连接,解释器就在这些目录中查找与你所要创建的类名称相关的.class文件(解释器还会去查找某些涉及java解释器所在位置的标准目录)

当这个类被修饰public的话,为什么源文件名必须要与类名相同相关推荐

  1. C++——类访问修饰符

    类访问修饰符 数据封装是面向对象编程的一个重要特点,它防止函数直接访问类类型的内部成员.类成员的访问限制是通过在类主体内部对各个区域标记 public.private.protected 来指定的.关 ...

  2. Java中的主类概念以及public static void main方法的分析

    1. 首先一定要有main()函数,不然你说从哪个函数开始执行呢 2. 包含main函数的类名不需要和文件名一致 因为字节码文件名只和类名有关,执行java程序时,也只是"java 类名&q ...

  3. JAVA知识学习——类的修饰符

    Java程序在定义类时,除了使用class关键字标识之外,还可以在class之前增加若干类的修饰符来修饰限定所定义的类的特性.类的修饰符分为访问控制符和非访问控制符两大类.修饰符之间的先后排列次序对类 ...

  4. C++:类访问修饰符

    C++ 类访问修饰符 类成员的访问限制是通过在类主体内部对各个区域标记 public.private.protected 来指定的. 关键字 public.private.protected 称为访问 ...

  5. 类和对象编程(二):类访问修饰符

    C++ 类访问修饰符 数据封装是面向对象编程的一个重要特点,它防止函数直接访问类类型的内部成员.类成员的访问限制是通过在类主体内部对各个区域标记 public.private.protected 来指 ...

  6. Python+Flask.0010.FLASK即插视图之自定义视图类及修饰器

    2019独角兽企业重金招聘Python工程师标准>>> 即插视图; 说明: FLASK的视图灵感来自于DJANGO的基于类而非基于函数的通用视图,主要目的是为了解决多个视图函数之间已 ...

  7. es6 Decorator类的修饰器

    类的修饰器 许多面向对象的语言都有修饰器(Decorator)函数,用来修改类的行为.目前,有一个提案将这项功能,引入了 ECMAScript. @testable class MyTestableC ...

  8. java主类不用public_Java源文件如果含有主类,主类必须是public类

    Java源文件如果含有主类,主类必须是public类 答:× 某产妇,会阴侧切,顺产一女婴,母儿无异常,母乳喂养.对该产妇的产褥期护理,下列内容错误的是() 答:鼓励多饮水,产后 7 小时内及时排尿 ...

  9. 甲基/丁基/辛基不同链长烷基取代咪唑类离子液体修饰SBA-15|科研级试剂

    甲基/丁基/辛基不同链长烷基取代咪唑类离子液体修饰SBA-15|科研级试剂 1-己基-3-甲基咪唑氯盐([HMIM]Cl),溴盐([HMIM]Br),碘盐([HMIM]I),硫酸氢盐([HMIM]HS ...

最新文章

  1. 初版python计算器
  2. J2ee分布式框架--技术介绍文档
  3. 【拾贝】版本控制-git 建立Team项目
  4. 设备驱动程序INF文件
  5. C++基本操作符重载
  6. 分销与供应链海外采购电子元器件,你需要了解哪些报关知识?
  7. opencv 学习笔记9:图像缩放与图像翻转
  8. 测试开发——软件测试虚拟环境的搭建
  9. js室内地图开发_GIS开发_OpenLayers
  10. PyQt5笔记(03) -- 消息框
  11. 苹果Mac侧边栏笔记工具:​​​​​​​​SideNotes
  12. 【BZOJ】3495: PA2010 Riddle
  13. 白话设计模式--实践应用--Chain of Responsibility(职责链)和factory模式
  14. kafka知识 --kafka权威指南
  15. Android 自定义viewGroup实现淘宝二楼及处理多指触控事件
  16. 线性代数学习笔记——第三十三讲——向量混合积的几何意义
  17. bada打地鼠应用程序简介
  18. 点击鼠标左键开枪,有射击特效,射击到物体上面有弹孔克隆,子弹运动距离在100米
  19. 关于相机坐标到投影空间坐标转换的理解
  20. Paul Graham:未来的互联网创业

热门文章

  1. IT互联网行业的 数据安全 风险评估 参考案例 -摘录数据安全风险评估白皮书
  2. Windows 10开启ISS Web服务
  3. 文档流,脱离文档流的方式
  4. python如何让外星人随机移动_太空入侵者游戏让外星人一起移动
  5. 面试指导笔记——面试篇
  6. 小程序分类图标提取_腾讯手机管家“垃圾分类”小程序上线 get分类指南
  7. 快速把照片做成MV,用什么软件好?抖音火爆效果制作
  8. IDEA修改编辑与控制台字体大小
  9. 【李开复】从诚信谈起 (一)
  10. POI下载表格数据,带有表格样式时下载文件为0