JavaSE_18_Java源文件结构

在基本的Java类和对象说完之后,下面的主要内容就是Java的基本语法了。

慢着,在这之前,我们再插播一些别的内容,这样,在正式开始Java语法内容之前,先对Java的源文件(即代码)有一个整体性的概括了解。当然,很多的内容如果要详细了解的话,需要后面的内容帮助,只是一个大概的了解,不需要多么的清楚。后面的内容会一一进行详细的解释说明的。

下面就来说说Java源文件结构,毕竟以后无论怎么写Java代码,你也逃不开Java源文件的“魔爪”了。

Java源文件有一些层次上的特殊规定。

package 语句       //0或1个,必须放在文件开始

import语句             //0或多个,必须放在所有类定义之前
public classDefinition    //0或1个
classDefinition           //0或多个
interfaceDefinition     //0或多个

先简单说下,其中package语句和import语句分别用于声明类所在的“包”和从特定的包中引入类;interfaceDefinition表示接口的定义。

在这边需要特别注意的是,Java是严格区分大小写的。定义为public的类名必须与java文件名称完全一致,每个java源文件只能有一个定义为public的类,但可以有几个非public的类名。

例如,我们回头来看前面的示例,可以看到,在这个程序中,定义了两个类:Student和StudentTest,其中,StudentTest这个类被定义为public的,因此,这个Java程序的名称必须是StudentTest而不是其他。如果public 的类名和文件名称不一致,编译时将会出现错误。

好了,后面再详细说说package和import。他俩是互相依存的。如果没有了package,import的存在就没有意义了。如果没有了import,package无法进行实际的操作了。


package语句


接着来讲讲在Java源文件中,除了类之外,另外非常重要的两个部分:package和import。

 

这篇来说package。

 

 

按照一般的解释来说,package的出现,是为了解决同名类的问题的。

 

这么说吧,

 

如果你现在有两个同名的文件,要保存在你的硬盘上,你怎么处理?不要提重命名,不允许改名。怎么办?其实建立两个文件目录,把两个同名文件分别放到两个不同的目录中,就可以了。

 

对极了。实际上,我们可以把package看做是文件目录,事实上,如果一个类设置了package,最后在编译好之后,处理方式就是讲编译好的类,按照类中package的声明,放入对应的目录中。比如你有两个Student类,实现逻辑不一样,一个是小学生、一个是大学生,当然都是学生类,这样你就可以建立两个package,分别把两个编译后的类文件放入相应的目录里面,即该类中声明的package的位置。

 

就像你可以建立多级目录一样,在Java中,package的声明也可以是多级的有层次的。还拿两个学生类来说,都声明为public class Student,但是声明不同的包。Java使用 . 来分割各个层级的package目录。

 

package cn.edu.university

 

package cn.edu.primary

 

这样,把代表大学生的学生类放入第一个包中,把代表小学生的类放入第二个包里面,就解决了类命名冲突的问题了。

 

拿第一个包来说明,这个包路径,就是一个文件目录路径,只要把.换成\,就是一个标准的windows目录了。cn\edu\university

 

package语句的基本语法如下:package  <top_pkg_name> [ .<sub_pkg_name>] * ;

 

为了避免不同的公司之间类名的重复,Sun建议使用公司Internet域名的倒写来当作包名,例如,使用域名tsinghua.edu.cn的倒写 cn.edu.tsinghua来作为包的名称。

 

要注意的是,如果使用命令行的javac编译命令对Java源文件进行编译,编译好的只是一个类文件,如果要使用这个类文件(类),你必须将这个类文件放入到对应该类的package声明的目录下,就像前面说到的。并且在使用该类的时候,要完整的引用该类。比如要引用前面的那个大学生类,必须这么来写:java cn.edu.university.Student。

 

你可能会觉得这么用很麻烦,大家都是这样认为的。不过不用担心,基本上常用的IDE工具,都提供package声明处理的基本操作。比如Eclipse,你只需要首先建立相应的package,然后再相应的package里面创建类,Eclipse会自动对正确的类进行编译,并按照类所处package,在编译后的位置,建立相应的目录,把编译后的类文件放进去,所以,不用担心,你需要做的只是编写代码,后续的动作都由IDE来做,不然软件开发效率怎么来提高啊?

 

不过现在使用package的目的已经和最初的不太一样了。实际上在实际开发里面,很少会出现重名的类文件的(除非是多方合作,使用其他第三方包等),更多的时候,package和我们现在使用文件夹目的是一样的,使用文件夹来讲不同类型、不通功能的文件分门别类的放置,方便使用和查找。想想你的电脑上的文件目录,没错吧。

 

package就说到这,在IDE中使用package,几乎是没有任何难度门槛的。


import语句


这次来讲讲import的作用以及用法。

 

package的应用使得Java开发大型的软件成为可能。package可以把大量的class类按照业务功能、功能类型等标准,进行分门别类的放置管理。但是同时也带来了一个问题:不在同一个包里面的类,怎样互相引用?

 

 

这种情况是会不断经常出现的。比如,开发一个学校校务管理系统,对学生成绩进行管理,学生成绩相关的信息有:学生信息、课程信息、授课老师信息等等。这几个业务功能类,很有可能放在不同的package里面,而学生成绩信息功能类要使用这些类怎么来找到它们?

 

自动根据类名,由Java编译器来自动检索整个代码库,这显然是不可能的,更何况还有同名的类!

 

实际上,在编译器定位你所创建的类所访问的其他类的过程中,包(package)扮演了重要的角色。当编译器碰到一个类对另一个类的引用时,它会在当前的包中和设置的CLASSPATH中寻找这个类,以检查这个类是否能在这些路径中找到。

 

解决办法就是再使用的时候,不仅要告诉Java编译器你要调用的类名,还得描述清楚这个类它所处的包路径,Java编译器就会按照包路径,在相应的目录中查找到该类,完成该类的引用。

 

但是这样使用起来太麻烦了,如果你每次使用学生类都得这么引用:cn.edu.university.Student,估计写不了10次,就得崩溃了,更何况一个类里面不会只引用一个其他package的类,你的代码里面充斥着这样的引用,该是多么抓狂的一件事。

 

import就是解决这个问题的。你只要在类声明之前,告诉Java编译器,将我要使用的类实现引入类里面,这样在你的代码里面,你只需要写类名,Java编译器会拿着类名,在你指定的package中去查找匹配。

 

mport语句应该出现在package语句(如果有的话)之后,类的定义之前。package语句只能有一个,但是import语句可以有任意多个。

 

import语句的基本语法如下:
import  <pkg_name>[.<sub_pkg_name>].<class_name>;

import <pkg_name>[.<sub_pkg_name>].*;

 


引入一个类:
import cn.edu.tsinghua.college.Student

 

引入指定包中的所有类使用通配符“*”:
import cn.edu.tsinghua.college.*

 

这两种方式对于引入相应的类并没有什么区别。但是,如果只是需要一个包中有限的几个类,建议采用第一种方式(写明引入的类名)会比较让人一目了然。更多的时候,使用一个package里面不止一个类,所以通配符的用法更常用一些。不用担心使用通配符会在一个类中导入过多无用的类。在进行编译的时候,Java编译器会进行筛选的。代码是给人来阅读的。

 

另外,需要注意的是,通过import引入包中的类的时候,它并不会递归的去执行引入动作

 

比如在cn.edu.university包下面还有子包,在你通过import语句导入这个包之后,这个包的子包的类,Java编译器是不会自动去进行分析导入的,如果你要引用的话,必须再写一个import,完成子包类的导入。

 

另外,细心的读者可能发现,在前面的类中,我们使用了String这个Java字符串类,但是并没有对这个类进行import导入操作。这里先解释一下。

 

Java平台并不只是提供了一个Java代码的编译和运行功能,它是一个完整的Java代码开发环境。并且已经提供了大量编写好的Java功能类,我们可以直接拿来使用,比如String这个字符串类,代表一系列字符的存储对象,要实现所有的String功能,并不是一件容易的事情,但是幸好这类大量的工作Java已经做好了。我们要做的就是“坐享其成”。

 

另外,为了方便Java程序员进行Java程序的开发,Java编译器默认将java.lang这个核心包里面的类已经全部引入了你编写的类里面。这个包是Java核心包,你的类里面基本不可能绕开这个包里面的类,所以。。。就是默认引用了。就像你的类里面,即使你没有写一个import语句,最后Java编译器在编译的时候,就在相应的位置增加一个import语句:import java.lang.*;

 

既然说到了Java平台里面JDK中的类,下一篇就先简单说一下Java开发平台中常用的java类库。

这里补充一点有关import的说明:

 

使用import并不会将相应的类或者包加载到class文件(或者java源文件),或者包含到java源文件(或者class文件)中,它的作用仅仅是对需要用到的类进行定位(location)。它表示程序中用到某个类的时候,如果没有在类前指定包名,应该到当前目录或者import指定的包中去寻找(注意java.lang包是默认引入的)。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值