专栏首页java小白为什么文件名必须和public修饰的类名称必须一致

为什么文件名必须和public修饰的类名称必须一致

因为: Java是被解释执行的。它在运行时并不是将所有的class文件全都放到内存中。而是在遇到import的时候才去相应的文件目录找相应的class文件。 对于一个public类,它是可以被项目中任何一个类所引用的,只需在使用它前import一下它所对应的class文件即可。将类名与文件名一一对应就可以方便虚拟机 在相应的路径(包名)中找到相应的类的信息。如果不这么做的话,就很难去找,而且开销也会很大。


为什么一个java源文件中只能有一个public类? 答案: 每个编译单元(文件)只能有一个public类。这么做的意思是,每个编译单元只能有一个公开的接口,而这个接口就由其public类来表示。而非public修饰的类都是为了给public修饰的类所做支撑的,从软件架构设计和安全性设计上得出的结论。或者说是java的设计者们从这方面的考虑。或许这真的是一个规范


个人总结:

列表内容

  • 一个源文件(.java)里,没有用public修饰的类也可以和文件名一致。
  • 一个源文件中可以存在类名和文件名不一致的情况,但不能用public修饰.
  • 如果一个包内不存在public修饰的类的话,那么我想这个包我觉得没有什么意义,因为不能为”客户程序员”提供接口,即使没有用public修饰的类里面含有public修饰了的静态方法,”客户程序员”也没有权限访问。
  • 源文件没有用public修饰的类主要是为public修饰的类”支撑”。
  • 最好不要在一个.java的源文件里写很多的类.
  • main方法不一定要在public修饰了的类下才能执行。但是main方法必须是public修饰的

有些文章说,用public修饰了的类里面才能调用main方法(程序的唯一入口),但我在没有用public修饰的类的情况下,JVM能执行mian方法。


《Thinking in Java》解释

为Java 创建一个源码文件的时候,它通常叫作一个“编辑单元”(有时也叫作“翻译单元”)。每个编译单元都必须有一个以.java 结尾的名字。而且在编译单元的内部,可以有一个公共(public)类,它必须拥有与文件相同的名字(包括大小写形式,但排除.java 文件扩展名)。如果不这样做,编译器就会报告出错。每个编译单元内都只能有一个 public 类(同样地,否则编译器会报告出错)。那个编译单元剩下的类(如果有的话)可在那个包外面的世界面前隐藏起来,因为它们并非“公共”的(非public),而且它们由用于主public 类的“支撑”类组成。编译一个.java 文件时,我们会获得一个名字完全相同的输出文件;但对于.java 文件中的每个类,它们都有一个.class 扩展名。因此,我们最终从少量的.java 文件里有可能获得数量众多的.class 文件。如以前用一种汇编语言写过程序,那么可能已习惯编译器先分割出一种过渡形式(通常是一个.obj 文件),再用一个链接器将其与其他东西封装到一起(生成一个可执行文件),或者与一个库封装到一起(生成一个库)。但那并不是 Java 的工作方式。一个有效的程序就是一系列.class 文件,它们可以封装和压缩到一个 JAR 文件里(使用 Java 1.1 提供的 jar 工具)。Java 解释器负责对这些文件的寻找、装载和解释(注释①)。 ①:Java 并没有强制一定要使用解释器。一些固有代码的Java 编译器可生成单独的可执行文件。

感谢 参考文章: https://www.cnblogs.com/phpzxh/archive/2009/12/08/1619590.html http://blog.csdn.net/waitforfree/article/details/51033457

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JAVA链式编程

    但我之前个弊端,使用dbUtils的时候,从数据库中查出来的数据进行,set的时候,赋值不进去,可能是dbUtils的版本比较低吧! 知道的同学们希望可以多...

    秋白
  • FastJson学习之注解

    可以看到,本来应该是{“id”:20,”age”:30,”name”:”张三”},在字段上加了注解之后就变成了{“ID”:20,”age”:30,”nam...

    秋白
  • VMware 安装Centos6.5

    秋白
  • Java面向对象之抽象类,接口

    抽象类: 含有抽象方法的类被声明为抽象类 抽象方法由子类去实现 含有抽象方法的类必须被声明为抽象类 抽象类被子类继承,子类(如果不是抽象类)必须重写抽象类中...

    二十三年蝉
  • java之门面模式详解

    本文先给个例子让你看懂了这个设计模式的概念,再分析这个这设计模式的优点,最后再具体的去看看实现方式。 1.一个例子来让你理解门面设计模式概念 最直观的需求是...

    如来
  • 依赖注入容器-- Autofac

    Autofac---Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上非常高...

    小世界的野孩子
  • 设计模式之行为型模式

    将一个请求封装成一个对象 ,从而使我们可用不同请求对客户进行参数化 :对请求排队或记录请求日志 ,以及支持可撤销的操作 .也叫: 动作Action模式 ,事务t...

    时间静止不是简史
  • (52) 抽象容器类 / 计算机程序的思维逻辑

    查看历史文章,请点击上方链接关注公众号。 从38节到51节,我们介绍的都是具体的容器类,上节我们提到,所有具体容器类其实都不是从头构建的,它们都继承了一些抽象容...

    swiftma
  • 设计模式-里氏替换

    先来看个最正宗的定义 如果对每一个类型为S的对象o1,都有类型为T的对 象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变 ...

    yiduwangkai
  • 如何站在使用者的角度来设计SDK-微信公众号开发SDK(消息处理)设计之抛砖引玉

    0.SDK之必备的基本素质 在项目中免不了要用到各种各样的第三方的sdk,在我现在的工作中就在公司内部积累了各种各样的的公共库(基于.net的,基于silver...

    blackheart

扫码关注云+社区

领取腾讯云代金券