----------- android培训、 java培训、java学习型技术博客、期待与您交流! ------------
包的概念
在 Java 语言中,为了对同一个项目中的多个类和接口进行分类和管理,专门设计了包的概念,使用包管理类和接口。
其实出现包的概念最开始的原因是避免类名重复,现在这个作用也得到了广泛的应用。
那么包到底是什么呢?其实包是一个逻辑的概念,就是给类名加了一个前缀,就像北京路这个路名上海和南京都有,再说这个路名时,就可以使用南京市北京路和上海市北京路进行区分,这里的北京路就相当于类,而前面的前缀,如南京市或上海市,就相当于包名。
在物理上包被转换成一个文件夹,操作系统通过文件夹来管理各个类和接口,从而实现对类的分类,或者称之为按照类的功能对这些类进行封装。
下面介绍一下和包有关的两个语法:打包和引入包。
打包
打包的作用就是将声明的类放入包中,也就是为类指定包名。在实际的项目中,一般根据类的功能来设定包。
打包的语法格式为:
package 包名 1[.包名 2[.包名 3]];
在该语法中,包名可以设置多个,包名和包名之间使用“.”进行分割,包名的个数没有限制。其中前面的包名包含后面的包名。按照 Java 语言的编码规范,包名所有字母都小写,由于包名将转换为文件夹的名称,所以包名中不能包含特殊字符。
例如:
package test;
package demo.chapter8;
package game.bubble.ui;
在示例中的最后一个, package game.bubble.ui ,该包名将转换为路径\game\bubble\ui,也就是前面的包名是后面包名的父目录。
需要特别注意的是:
1、打包的语句必须是程序代码中的第一行可执行代码,也就是说打包语句的上面只能包含
空行或注释。
2、打包的语句最多只有一句。
如果在代码中没有书写 package 语句,则该类将被打入到默认包中,默认包无法被其它的包引用。
示例代码:
//文件名:PackageClass.java
package chapter8;
public class PackageClass{
//类内部的代码
}
通过打包语法,可以为每个类增加一个前缀,也就是说以前使用类,使用类名即可,有了包名的概念以后,类的全名就是包名.类名了,通过在类名前面加入包名,可以使不同包中存在相同的类名,但是一般不建议一个项目中的类名存在重复。
当一个类有了包名以后,在编译和运行时将和前面的操作产生一些变化,下面介绍一下 JDK 和 Eclipse 中相关操作的变化。
a)JDK 编译和运行打包的源文件
编译源代码的命令:javac –d 类文件路径源代码名称
例如: javac – dd:\ PackageClass.java
该命令的作用是将 PackageClass 类编译成 class,并将生成的 class 文件存储到 d 盘根目录下。则 class 文件的存储路径是:d:\chapter8\PackageClass.class。使用该命令编译时自动将包名转换为文件夹。
如果想将编译生成的 class 文件生成在源代码所在的目录,则可以使用如下格式: javac –d .源文件名
这里的源文件可以使用*.java 代表当前目录下的所有源文件。
说明:执行 javac 命令必须将目录切换到源代码所在的目录。
运行类文件的格式: java 包名.类名
例如:java chapter8.PackageClass
该命令的作用是运行该类,按照上面的编译命令,运行该程序时,不应该切换到 class 文件
所在的目录,而是切换到最顶层的包名所在的目录,所以执行以上命令时,在控制台下面只
需要切换到 d 盘根目录即可。
b)eclipe 编译和运行打包的源代码
在新建源代码时,可以在新建类向导中,可以在 package 栏中添加包名,在 eclipse 编译时会自动生成包名的结构。运行带包名的代码也和以前的运行步骤一样。
需要特别注意的是:在 eclipse 中,源代码的组织也要求将包名转换为文件夹,否则将出现语法错误,这点在复制代码到 eclipse 项目中时需要特别小心。
引入包
当类进行了打包操作以后,同一个包内部的类默认引入,当需要使用其它包中的类时,则必须首先引入对应的类,然后才可以使用该类。
引入包的语法格式为:
import 包名 1.[.包名 2[.包名 3]].类名|*;
在该语法中,import 关键字后面是包名,包名和包名之间使用“.”分割,最后为
类名或“*”,如果书写类名则代表只引入该类,如果书写星号则代表引入该包中的所有类、
接口、异常和错误等。
例如:
import chapter8.*;
import java.io.*;
import chapter8. PackageClass;
引入包的代码书写在类声明语句的上面,打包语句的下面,import 语句在一个代
码中可以书写任意多句,例如:
package chapter8;
import java.io.*;
import java.net.*;
public class Test{
//其它代码
}
说明:这里的 java.io 包和 java.net 包都是 JDK 中提供的包名。
每引入一个类或接口,将在内存中占有几十个字节的空间,所以使用星号引入一个包中所有的类或接口虽然编写起来比较简单,但是却浪费了一些内存,而一个一个的引入类名编写起来又比较麻烦。
最后需要特别注意的是,import 只引入当前包下面的类,而不引入该包下面的子
包里面的类。例如:
//文件名:A.java
package a;
public class A{}
//文件名:B.java
package a.b;
public class B{}
//文件名:Test.java
import a.*;
public class Test{
public static void main(String[] args){
B b = new B();//语法错误,B 类未引入
}
}
说明:在该示例的 Test 类中,使用 import a.*;引入了包 a 中的所有类,也就是类
A,而包a的子包 a.b 中的类将不会被引入,所以在 Test 类中使用 B 类将出现语法错误。
包的概念小结
总之,包的概念(也就是命名空间)使得类名冲突的问题获得良好的解决,另外也可以使用包来分类管理一个项目中的多个类,使得项目中的类数量比较多时,结构显得比较清晰。
到现在为止,综合以前学习的所有语法知识,规范的类结构的代码如下:
打包语句
引入语句
类声明
这也是规范编写类结构代码的基础。 ----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------