何为包?先让我们来回忆一个场景:我们在生活中可曾遇到过和自己重名的人?那假如在同一个班里有两个易烊千玺,老师会如何区分呢?老师可能会在名字前面加一个限定词:大羊、小羊以作为区分。
类似的,Oracle公司的JDK、各种系统软件开发上、众多的软件开发商,他们会提供成千上万、各种各样的类。不同的软件公司在开发过程中也要提供大量的类,这些类也有发生同名的情况。解决的办法就是:Oracle也允许在类名前增加一个前缀来限定这个类。Java引入了包机制,提供了类的多层命名空间,用于解决类的命名冲突、类文件管理等问题。
Java允许将同一组功能相关的类放在同一个package下,从而组成逻辑上的类库单元。如果希望把一个类放在指定的包结构下,应该在Java源程序的第一个非注释行放置如下格式的代码

package packagename;

一旦在Java源文件中使用了这个package语句,就意味着该源文件里定义的所有类都属于这个包。位于包中的每个类的完整类名都应该是包名和类名的组合,如果其他人需要使用该包下的类,也应该使用包名加类名的组合

package lee;
public class Hello
{
   public static void main(String[] args)
   {
      System.out.println("Hello World!");
   }
}

package lee表明吧Hello放在lee包空间下。把上面源文件保存在任意位置,使用如下命令来编译这个Java文件

javac -d . Hello.java

-d选项用于设置编译生成class文件的保存位置,这里指定将生成的class文件放在当前路径(.代表当前路径)下。使用该命令编译该文件后,发现当前路径下并没有Hello.class文件,而是在当前路径下多了一个名为lee的文件夹,文件夹下有一个Hello.class文件。
假设某个应用中包含两个Hello类,java通过引入包机制来区分两个不同的Hello类。不仅如此,这两个Hello类还对应两个两个Hello.class文件,它们在文件系统中也必须分开存放才不会引起冲突。所以Java规定:位于包中的类,在文件系统中也必须有与包名层次相同的目录结构。
对于上面的Hello.class,它必须在lee文件夹下才是有效的,当使用带-d选项的javac命令来编译java源文件时,该命令会自动建立对应的文件结构来存放相应的clasa文件。
如果直接使用java Hello.java命令来编译这个文件,将会在当前路径下生成一个Hello.class文件,而不会生成lee文件夹。也就是说,如果编译java文件时不使用-d选项,编译器不会为java源文件生成相应的文件结构
进入编译器生成的lee文件夹所在路径,执行如下命令

java lee.Hello

看到上面程序正常输出
如果进入lee路径下使用java Hello命令来运行Hello类,系统将提示错误。因为Hello类位于lee包下,因此必须吧Hello.class文件放在lee路径下。

当虚拟机要装载lee.Hello类时,它会依次搜索CLASSPATH环境变量所指定的系列路径,查找这个路径下是否包含lee路径,并在lee路径下查找是否包含Hello.class文件。虚拟机在装载带包名的类时,会先搜索CLASSPATH环境变量指定的目录,然后在这些目录中按与包层次对应的目录结构去查找class文件。
同一个包中的类不必位于相同的目录下,例如有lee.Person和lee.PersonTest两个类,它完全可以一个位于C盘、一个位于D盘。只要让CLASSPATH环境变量里包含这两个路径即可。虚拟机会自动搜索CLASSPATH下的子路径,把他们当成同一个包中的类来处理。
Java源文件应放在与包名一致的目录结构下。如果系统中存在Hello类,通常也对应两个Hello.java源文件,如果把他们的源文件也放在对应的文件结构下,就可以解决源文件在文件系统中的存储冲突。
package语句必须作为源文件的第一条非注释性语句,一个源文件只能指定一个包,即只能包含一条package语句,该源文件中可以定义多个类,则这些类将全部位于该包下。
如果创建处于其他包下类的实例,则在调用构造器时也需要使用包前缀。例如在lee.HelloTes类中创建lee.sub.Apple类的对象

//调用构造器时需要在构造器前增加包前缀
lee.sub.Apple a = new lee.sub.Apple();

如果需要使用不同包中的其他类,总是需要使用该类的全名,这是一件很繁琐的事情。
于是,java引入了import关键字,import可以向某个java文件中导入指定包层次下的某个类或全部类。improt语句应该出现在package语句之后、类定义之前。一个java源文件只能包含一个package语句,但可以包含多个import语句,import语句用来导入多个包层次下的类。

import lee.sub.Apple;
import package.subpackage...*;

只能代表类,不能代表包。因此使用import lee.*;,它表明导入lee包下的所有类。

导入指定类的全部静态成员变量,方法的格式如下

import static package.subpackage...Classname.*;

上方法语法中的星号只能代表静态成员变量或方法名。
import static为“静态导入”。import可以省略写类名,而import static则可以连类名都省略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值