package关键字解析

本文详细介绍了Java中的package关键字,包括包的作用、命名规则和编译后的效果。包作为类的命名空间,用于避免类名冲突。遵循的命名规则通常基于域名,如公司官网域名倒写。在编译和运行时,需要根据包名创建相应的目录结构,否则会导致运行错误。同时,文章还阐述了JVM加载类的规则,无论是无包还是有包的类,都需要正确配置CLASSPATH。

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

简介

在java中,定义包的关键字是package

在程序中,要区分一些东西,一般会采用【命名空间】的设计方式,这是大多数语言都会采用的方式。

在java中,如果来区分俩个名字一样的类?例如,张三定义了一个类Hello,李四定义了一个类Hello,当把张三和李四的代码合并一起的时候,会出现俩个都叫Hello的类,那么这个时候该如果区分这个类?

可以使用package(包)来进行区分,例如张三定义的Hello这个类可以放在zhangsan这个名字的包下,李四定义的Hello这个类可以放在lisi这个包下,如下:

package zhangsan;
public class Hello{
    
}
package lisi;
public class Hello{
    
}

2.包规则

但是一般程序中,定义包的时候,不会直接用zhangsan、lisi这样的名字,而是都会遵从一些包的命名规则的:

1. package其实就是类的命名空间,用来唯一标识这个类的,避免和的类的名字重复

2. 一般情况,一个公司、组织、社团中所定义的包的名字,就是他们官网的域名(倒过来),因为域名一定是全球唯一的,不可能有俩个一样的域名。

例如,http://commons.apache.org/ 这官网下的代码中的包,都是 package org.apache.commons; 开头的。

例如,我们公司的代码中的包,都是以 package com.xxx; 开头的

例如,你个人写的代码,可以是以 package com.jim; 开头的,假设你的名字叫 jim

3. 类加上了包名,编译之后的效果

这样的类,在编译之后,都必须要有和包名对应的文件夹。
例如,package com.xxx.demo;
这里是三个包,包和包之间用点(.)隔开,编译完之后,需要有对应的三个文件夹分

别是com/briup/demo ,最后在demo目录中,才有编译生产的class文件

一个指定package的类,编译后该如何运行?
例如:

package com.briup.test;

public class Hello {
	
	public static void main(String[] args){
		System.out.println("hello world");
	}

}

编译代码
javac Hello.java

在这里插入图片描述
这里一定要先进入对应的目录下才能直接输入javac Hello.java,不然要输入绝对路径
运行代码:
java Hello

在这里插入图片描述
可以看到运行报错,但是我们已经完全产生了class文件
这个错误的原因是:Hello这个类是定义在指定的包中的,那么就需要在把生成的class文件存放到和包名相对于的文件夹中。

新建一个文件夹,把class文件放进去
在这里插入图片描述
再运行java Hello
在这里插入图片描述
会发现还是报错
这是因为,一个类一旦指定的包,那么在运行它的时候,就一定要带上它的包名

加上包名后再次运行:
java com.briup.test.Hello

在这里插入图片描述
类的名字有俩种:
简单类名:就是直接一个类名,例如 Hello
全限定名:包名加类,例如 com.briup.test.Hello

这时候有人会问了:难道每次编译好一个指定包的类,都需要手动去创建和包对应的目录么?

不需要,java中编码命令中有参数,可以直接帮我们在指定位置自动创建和包名对应的目录结构,并且把编译好的class文件自动存放到里面:
javac -d . Hello.java

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

运行这个编译好的带包的类:
java com.briup.test.Hello

在这里插入图片描述
也可以在指定的路径下,生成和包名对应的目录结构:
javac -d bin Hello.java

在这里插入图片描述
运行这个类:
java com.briup.test.hello

在这里插入图片描述
发现还是报错

这个错误原因是因为,当前路径下没有这个文件夹或者是CLASSPATH中的路径配置的不对,因为我们要运行的Hello类所对应的Hello.class文件,并不在当前目录下,而是./bin中,所以这时候我们可以临时指定一下路径,或者配置CLASSPATH变量

运行当前命令时,临时指定:
java -cp ./bin com.briup.test.Hello

在这里插入图片描述
-cp参数是-classpath的意思,表示执行当前java命令的时候,临时指定classpath一次,只生效这一次
另外,./bin 路径中,可以把./去掉,直接写成bin,因为这样默认就可以表示当前路径下的bin目录

3.规则

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

1. 如果运行的Hello类,没有指定包,Hello类一定对应的是Hello.class ( 固定要求)

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

  • 这个情况下,CLASSPATH中就要配置Hello.class文件所在的路径

2. 如果运行的Hello类,指定了包,例如是package com.briup.test; Hello类一定对应的是com/briup/test/Hello.class(固定要求)

那么当运行java com.briup.test.Hello的时候,JVM会从CLASSPATH中指定的路径中查找,是否有com/briup/test/Hello.class这个文件,如果有那么就加载到内存,然后运行,如果没有那么就报错。
注意,这个时候JVM从CLASSPATH的路径中,会先找com这个文件夹,然后依次找下去。因为如果有包存在的时候,这个包就是这个类不可分割的一部分。

  • 这个情况下,CLASSPATH中就要配置com文件夹所在的路径

3. 如果运行的Hello类,被打包到一个jar中,比如是me.jar

那么当运行java Hello的时候,JVM会从CLASSPATH中指定的路径中查找,是否有me.jar,如果有那么就从me.jar中将Hello.class载到内存,然后运行,如果没有那么就报错。(这是Hello没指定包的情况)
那么当运行java com.briup.test.Hello的时候,JVM会从CLASSPATH中指定的路径中查找,是否有me.jar,如果有那么就从me.jar中将com/briup/test/Hello.class加载到内存,然后运行,如果没有那么就报错。(这是Hello指定包的情况)

**注意,这时候,是要把jar文件的路径和jar文件的名字,都配置到CLASSPATH中**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值