corejava-笔记——package(包)

本文详细介绍了Java中的包(package)概念,包括其作为命名空间的作用,如何避免类名冲突,以及包的命名规则。内容涵盖包的全限定名,如何根据包名创建对应的文件夹结构,DOS窗口下编译和运行指定包的类的命令,以及JVM加载类时遵循的规则。重点强调了包在类加载过程中的重要性和CLASSPATH配置的相关知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

包规则

包的命名规则:

  1. package其实就是类的命名空间,用来唯一标识这个类的,避免和别的类的名字重复
  2. 一般情况,一个公司、组织、社团中所定义的包的名字,就是他们官网的域名倒过来写,因为域名一定是全球唯一的,不可能有两个一样的域名。例:http://commons.apache.org/ 这官网下的代码中的包,都是 package org.apache.commons; 开头的。
    个人写的代码可以是package com.winter开头的,假设你的名字是winter
  3. 类加上了包名,编译之后的效果:
    该类编译之后都必须要有和包名对应的文件夹,例如:package com.test.demo1;
    这里有三个包,包和包之间用点(.)隔开,编译完成后,需要有对应的三个文件夹,分别是:
    com/test/demo1,在demo1目录中,存放对应的class文件

在DOS窗口下编译运行指定package的类的命令

package com.test.demo1;
public class Hello{
	public static void main(String[] args){
	...
	}
}
  1. javac Hello.java
    java Hello
    运行报错:找不到或无法加载主类Hello

错误原因:Hello这个类是定义在指定的包中的,那么就需要在对应的包中将生成的class文件放进去。
此处需要手动创建包,并将class文件放入包中

建好包并将class文件放入包中之后,再运行
java Hello
运行报错:找不到或无法加载主类Hello

错误原因:一个类一旦指定了包,那么运行的时候就必须带上他的包名(全限定名)

java com.test.demo1.Hello
运行成功

  1. javac -d . Hello.java
    java com.test.demo1.Hello
    运行成功
    此处无需手动创建包

命令中,-d表示编译时自动生成和包名对应的目录结构,-d后面的点(.)表示就在当前目录中生成,
注:编译成功后,还会自动把编译好的class文件存到这个生成的目录中

  1. javac -d bin Hello.java
    该命令是将编译后的代码对应的包存放在当前目录下的bin目录下
    此时运行这个类就需要指定一个临时的classpath
    java -cp ./bin com.test.demo1.Hello

-cp是-classpath的意思,表示执行当前java命令的时候,临时指定classpath一次,只生效这一次
另外,./bin路径中,可以吧./去掉直接写bin,表示当前路径下的bin目录

规则

运行一个累的时候,JVM加载这个类的规则是什么?

  1. 如果运行的Hello类,没有指定包,Hello类一定对应的是Hello.class
    那么当运行java Hello的时候,JVM会从CLASSPATH中指定的路径中查找,是否有Hello.class这个文件,如果有那么就加载到内存,然后运行,如果没有那么就报错

    • 这个情况下,CLASSPATH中就要配置Hello.class文件所在的路径
  2. 如果运行的Hello类,指定了包,例如package com.test.demo1Hello类一定对应的是com/test/demo1/Hello.class
    那么当运行java com.test.demo1.Hello的时候,JVM会从CLASSPATH中指定的路径中查找,是否有com/test/demo1/Hello.class这个文件,如果有那么就加载到内存,然后运行,如果没有那么就报错
    注:这个时候JVM从CLASSPAHT的路径中,会先找com这个文件夹,然后一次找下去。因为如果有包存在的时候,这个包就是这个累不可分割的一部分

    • 这个情况下CLASSPATH中就要配置com文件夹所在的路径
  3. 如果运行的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中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值