1.使用package(包)来区分两个名字相同的类。
比如,aaa定义的Hello类放在名字为aaa的这个包下面,bbb定义的Hello类放在名字为bbb的这个包下面。
package aaa;//对应了一个名为aaa的文件夹
public class Hello{
}
package bbb;//对于了一个bbb的文件夹
public class Hello{
}
2.package其实就是类的命名空间,用来唯一标识这个类的,避免类的重复。
①一般情况下,一个公司、社团中所定义的包的名字,就是他们官网的域名(倒过来),因为域名一定是全球唯一的。
例如,http://commons.apache.org/ 这官网下的代码中的包,都是
package org.apache.commons;
开头的。
②类加上了包名,在编译之后,都必须要有和包名对应的文件夹。
例如,
package com.baidu.demo;
这里是三个包,包和包之间用点(.)隔开,编译完之后,需要有对应的三个文件夹分别是 com/baidu/demo ,最后在demo目录中,才有编译生产的class文件。
3.使用javac Hello.java
来编译代码,编译通过后使用java Hello
来运行代码。
①Hello这个类是定义在指定的包中的,那么就需要在把生成的class文件存放到和包名相对应的文件夹中。
②一个类一旦指定的包,那么在运行它的时候,就一定要带上它的包名。
4.类名种类:
①简单类名:直接一个类名。
②全限定名:包名加类。
5.每次编译好一个指定包的类,都不需要手动去创建和包对应的目录。
使用javac -d . Hello.java
命令,该编码命令中有参数,可以直接帮我们在指定位置自动创建和包名对应的目录结构,并且把编译好的class文件自动存放到里面。
该命令中,-d表示编译时自动生成和包名对应的目录结构,-d后面的点(.)表示就在当前目录中生成。编译成功后,还会自动把编译好的class文件存到这个生成的目录中。
6.运行一个类的时候,JVM加载这个类的规则:
①如果运行的Hello类,没有指定包,Hello类一定对应的是Hello.class ( 固定要求)。那么当运行 java Hello 的时候,JVM会从CLASSPATH中指定的路径中查找是否有Hello.class这个文件。如果有那么就加载到内存,然后运行;如果没有则就报错。
②如果运行的Hello类,指定了包,例如是package com.baidu.test;
Hello类一定对应的是com/baidu/test/Hello.class(固定要求)。那么当运行 java com.baidu.test.Hello 时,JVM会从CLASSPATH中指定的路径中查找是否有com/baidu/test/Hello.class这个文件。如果有那么就加载到内存,然后运行,如果没有就报错。这个时候JVM从CLASSPATH的路径中,会先找com这个文件夹,然后依次找下去。因为如果有包存在的时候,这个包就是这个类不可分割的一部分。这个情况下,CLASSPATH中就要配置com文件夹所在的路径。
③如果运行的Hello类,被打包到一个jar中,比如是we.jar。把jar文件的路径和jar文件的名字,都配置到CLASSPATH中。
Ⅰ.**当Hello类没有指定包时:当运行 java Hello
时,JVM会从CLASSPATH中指定的路径中查找是否有we.jar,如果有那么就从we.jar中将Hello.class载到内存,然后运行。如果没有那么就报错。
Ⅱ.当Hello类指定了包时:**当运行 java com.baidu.test.Hello 时,JVM会从CLASSPATH中指定的路径中查找是否有we.jar。如果有,那么就从相应的we.jar中把com/baidu/test/Hello.class加载到内存,然后运行,如果没有那么就报错。