包与子包
- 什么是一个包?
包(package)是一系列功能相关的类放在一起组成的类库单元。简单地说,包就是一系列功能相关的类的集合。
- 那么为什么要引入包的概念呢?
这是为了解决类的重名冲突。
生活中,我们都会遇到同学重名的情况:两同学,都叫张三,那么我们都是如何将他们呢加以区分的呢?
我们通常是不是采取给他们添加前缀的方式来对他们加以区分:如果他们属于不同的班级,分别属于1班,2班,我们就会说1班的张三。
同样,对于类而言,我们采取为他们添加包名前缀的方式,来对他们进行区分。比如说:对于两个类,名字都叫做love,我们就会说它是slong包下的love类啊,还是其他包比如sophie包下的love类啊来进行区分。同时使用的时候,我们也也应该如此,采用包名+类名的方式来对其进行使用:slong.Love 或者是sophie.Love而不是直接使用Love//包名通常采用小写,类名通常首字母大写
但是随着类和包的数量越来越大,可能发生包名和类名都重复的情况。这种情况下,我们还是采用添加前缀的方式,进行区分,还是之前的例子:1班的张三,2班的张三,添加学校前缀,振华中学的1班的张三,和金水中学的1班的张三。由此就衍生出了子包的概念。这里1班就是振华中学的子包。当数量继续增大的时候,还是采用同样添加前缀的方式。。。。
那么使用相应类的时候,需要将完整包名+类名(父包.子包.+…+类)进行调用即:a.slong.Love
- 如何定义一个包及其子包?
一个源文件中只能有指定一个包,即只能包含一个package语句,并且此语句作为源文件的第一条非注释性语句。之后在此文件中便可以定义多个类,这些类就将全部位于该包下。
包的定义:
/*
这是一个文件
定义一个包
*/
package lee;
public class HelloTest
{
....
}
class ByeTest
{
....
}
子包的定义也是一样:
/**
定义一个子包
*/
package lee.sub;
public class Apple{}
注意同一个包的类之间直接使用相应的类名进行访问,但不同的包之下的类之间必须使用完整的类名进行访问,即使用完整包名+类名的方式进行访问使用。值得注意的是,虽然子包可以表明子包是父包中的一个模块,但是如果父包中的类调用子包中的类进行对象的创建的时候,仍然需要使用子包的全名,而不能省略父包的部分。
比如:如果想在父包中的HelloTest中调用lee.sub包中的Apple类进行对象的创建的话,则需要使用以下代码
package lee;
public class HelloTest
{
lee.sub.Apple a = new lee.sub.Apple();
}
/*
不能省略父包的部分,使用sub.Apple a = new sub.Apple();进行创建
*/
导入包
当需要使用不同包内的其他类的时候,虽然使用完整类名,已经能够满足我们的使用,但是当完整类名很长的情况下,就会给编程带来麻烦。因此为了简化编程,java中引入了import关键字,进行导入。
导入包分为两种情况:
1,导入包下的某个类或者全部类(导入类),用到import
2,导入指定类的某个静态成员变量,方法(导入静态方法或者变量),用到import static
在进行导入包之后,使用相关类和变量和方法的时候,就可以省略包名,直接使用相应的类名、变量名和方法名即可,这样就简化了编程。
具体用法如下:
/*
我们使用import 关键字来导入其他包中的类,
用import static 关键字来导入其他包中的静态变量和方法
*/
//引入其他包中的某个指定类
import java.lang.System;
//引入其他包中的所有类,但是这里的所有类并不包含其子包中的定义的类
import java.lang.*;
//引入其他包中所有的静态变量和静态方法
import static java.lang.System .*;
import static java.lang.Math .*;
public class Test
{
out.println(PI);
//out 是Systerm类中的静态成员变量,代表标准输出
//PI是java.lang.Math类中的静态成员变量,表示Π常量
out.println(sqrt(256));
//直接调用Math类中的sqrt静态方法
}
那么之前调用lee.sub子包中的Apple类的时候进行对象的创建,必须使用完整类名lee.sub.Apple
现在我们就可以利用import导入,简化为就可以简化为如下代码:
package lee;
import lee.sub .*;
public class HelloTest
{
Apple a = new Apple();
}
最后需要指明,import和import static语句的位置,其应该放在package语句之后,类的定义之前。一个源文件中只能有一条package语句来说明这个源文件中所有类在哪一个包中,但是可以有多条import语句进行导入,并且这多条import语句之间没有顺序要求。