package(包)
简介
在程序中要区分一些东西,一般会采用命名空间的设计方式。
在java中利用package(包)来进行区分两个名字一样的类。
例如:
package com.test.demo1;
public class Hello {...}
package com.test.demo2;
public class Hello {...}
类的名字有两种:
- 简单类名:就是直接的类名,如Hello
- 全限定名:包名加类名,如com.test.demo1.Hello
因此上述两个Hello类的全限定名为:
com.test.demo1.Hello
com.test.demo2.Hello
包规则
包的命名规则:
- package其实就是类的命名空间,用来唯一标识这个类的,避免和别的类的名字重复
- 一般情况,一个公司、组织、社团中所定义的包的名字,就是他们官网的域名倒过来写,因为域名一定是全球唯一的,不可能有两个一样的域名。例:http://commons.apache.org/ 这官网下的代码中的包,都是
package org.apache.commons;
开头的。
个人写的代码可以是package com.winter
开头的,假设你的名字是winter - 类加上了包名,编译之后的效果:
该类编译之后都必须要有和包名对应的文件夹,例如:package com.test.demo1;
这里有三个包,包和包之间用点(.)隔开,编译完成后,需要有对应的三个文件夹,分别是:
com/test/demo1,在demo1目录中,存放对应的class文件
在DOS窗口下编译运行指定package的类的命令
package com.test.demo1;
public class Hello{
public static void main(String[] args){
...
}
}
javac Hello.java
java Hello
运行报错:找不到或无法加载主类Hello
错误原因:Hello这个类是定义在指定的包中的,那么就需要在对应的包中将生成的class文件放进去。
此处需要手动创建包,并将class文件放入包中
建好包并将class文件放入包中之后,再运行
java Hello
运行报错:找不到或无法加载主类Hello
错误原因:一个类一旦指定了包,那么运行的时候就必须带上他的包名(全限定名)
java com.test.demo1.Hello
运行成功
javac -d . Hello.java
java com.test.demo1.Hello
运行成功
此处无需手动创建包
命令中,-d表示编译时自动生成和包名对应的目录结构,-d后面的点(.)表示就在当前目录中生成,
注:编译成功后,还会自动把编译好的class文件存到这个生成的目录中
javac -d bin Hello.java
该命令是将编译后的代码对应的包存放在当前目录下的bin目录下
此时运行这个类就需要指定一个临时的classpath
java -cp ./bin com.test.demo1.Hello
-cp是-classpath的意思,表示执行当前java命令的时候,临时指定classpath一次,只生效这一次
另外,./bin路径中,可以吧./去掉直接写bin,表示当前路径下的bin目录
规则
运行一个累的时候,JVM加载这个类的规则是什么?
-
如果运行的Hello类,没有指定包,Hello类一定对应的是Hello.class
那么当运行java Hello
的时候,JVM会从CLASSPATH中指定的路径中查找,是否有Hello.class这个文件,如果有那么就加载到内存,然后运行,如果没有那么就报错- 这个情况下,CLASSPATH中就要配置Hello.class文件所在的路径
-
如果运行的Hello类,指定了包,例如
package com.test.demo1
Hello类一定对应的是com/test/demo1/Hello.class
那么当运行java com.test.demo1.Hello
的时候,JVM会从CLASSPATH中指定的路径中查找,是否有com/test/demo1/Hello.class这个文件,如果有那么就加载到内存,然后运行,如果没有那么就报错
注:这个时候JVM从CLASSPAHT的路径中,会先找com这个文件夹,然后一次找下去。因为如果有包存在的时候,这个包就是这个累不可分割的一部分- 这个情况下CLASSPATH中就要配置com文件夹所在的路径
-
如果运行的Hello类,被打包到一个jar中,比如me.jar那么当运行
java Hello
的时候,JVM会从CLASSPATH中指定的路径中查找,是否有me.jar,如果有那么就从me.jar中将Hello.class加载到内存,然后运行,如果没有那么就会报错。(上述是没有指定包的情况下)
(指定包)当运行java com.test.demo1.Hello
的时候,JVM会从CLASSPATH中指定的路径中查找,是否有me.jar,如果有那么就从me.jar中将com/test/demo1/Hello.class加载到内存,然后运行,如果没有那么就报错。
注:此时,需要把jar文件的路径和jar文件的名字,都配置到CLASSPATH中