【Java13】包

news2024/11/22 16:35:19

“包”这个机制,类似于分组。主要作用是区分不同组内的同名类。例如,高三三班有一个“王五”,高二八班也有一个“王五”。高三三班和高三八班就是两个不同的包。

Java中的包(package)机制主要提供了类的多层命名空间,用于解决类的命名冲突、类文件管理等。

类似于C++中的命名空间namespace

如果希望把一个类放在指定的包结构下,应该在Java源程序的第一个非注释行声明:

package packageName;

一旦如上声明,这个源文件中所有定位的类都属于这个包。

如果其他人要使用这个类,需要使用这个类的完整名称:包名+类名。

// 文件:Hello.java
package lee;
public class Hello
{
  public static void main(String[] args)
  {
    // TODO
  }
}

如果使用如下命令来编译

javac -d . Hello.java

按道理,-d是指定编译结果.class文件的位置,这里指定是当前目录(.),但实际上是在当前路径下创建了一个文件夹lee,里面包含Hello.class。

这是因为,Java规定位于包中的类,在文件系统中也必须有与包名层次相同的目录结构

但是,如果直接使用javac Hello.java不会创建lee文件夹。这样做也属于挑战智商的行为,一般还是推荐使用-d,让它形成层次目录结构。

在执行的时候,需要给出这个类的完整名称:

java lee.Hello

虚拟机在装载lee.Hello类时,会依次搜索CLASSPATH环境变量所指定的系列路径,查找这些路径下是否包含lee路径,并在lee路径下查找是否包含Hello.class文件。同一个包中的类不必位于相同路径下,只要它们都在CLASSPATH环境变量中即可。例如lee.Person可以在C盘中,lee.PersonTest可以在D盘中。

另外,除了类文件组织成层次结构外,源文件也要组织成对应的层次结构。此外,建议把源文件和class文件分开放:

在这里插入图片描述

把class文件放到某个目录下,并不意味这个目录成了这个类的包名。必须在Java源文件中声明package来指定。

Java包机制运行需要两个条件:

  1. 在源文件中打包(package packageName);
  2. class文件位于对应路径下(这个一般通过编译器来自动管理)。

对于包重名的情况,建议包也可以通过层级来组织,比如org.crazyit.elearning.student.lee云云。

package的使用有如下注意事项:

  1. 必须是源文件中非注释的第一句;
  2. 一个源文件只能指定一个包;
  3. 如果没有显示指定包,则类位于默认包下;
  4. 同一个包下的类可以自由访问。
// HelloTest.java
package lee;
public class HelloTest
{
  public static void main(String[] args)
  {
    // 直接访问相同包下的类,不需要使用包前缀
    var h = new Hello();
  }
}

如果在lee包下再定义一个子包,那么子包中的类不能直接访问lee包中的类了。此外,在使用子包中的类时,要使用该类的全名(包名+类名),不能省略前面lee包的路径。

package lee.sub;
public class Apple{}

lee.Hello中使用Apple类时,必须用完整路径lee.sub.Apple

可以这么理解:父包和子包从逻辑上存在上下关系;但是从用法上没有任何关系。所以调用时要使用完整包名+类名。

package lee;
public class Hello
{
	public static void main(String[] args)
  {
    var a = new lee.sub.Apple(); // 使用完整路径
  }
}

为了简化对不用包的类的调用,Java引入了import关键字。import可以导入指定包层次下的某个类或全部类。

  • importpackage之后,类定义之前;
  • 一个Java源文件只能有一个package,但是可以有多个import
import lee.sub.Apple; // 导入lee.sub中的Apple类
import lee.sub.* 			// 导入lee.sub中的所有类

使用import后,在当前源文件中就不用再输入完整路径了。

这一条和C++中的using namespace类似。

Java默认所有源文件都导入了java.lang包下的所有类。所以String, System类不需要显示的import。

import语句可以简化编程,但并不是必需的

JDK 1.5之后,还允许使用import导入类成员变量、类方法,区别在于加上了static修饰符:

import static package.subpackage.className.fieldName|methodName;

例如,使用import static导入java.lang包中System类和Math类的所有静态成员和静态方法(类成员和类方法):

import static java.lang.System.*;
import static java.lang.Math.*;

public class StaticImportTest
{
  public static void main(String[] args)
  {
    // out是System的成员方法;
    // PI是Math类的成员变量;
    out.println(PI);
  }
}

现在总结Java源文件的大致结构:

package 语句;  // 0或者1条,位于文件非注释行的最开始
import | import static 语句; // 0条或者多条,位于package之后,第一个public类定义之前
public className | interfaceName | enumName; //0个或者1个public类、接口或枚举,注意一个源文件只能有1个public类
className | interfaceName | enumName; // 0个或多个普通类、接口或枚举,可以有,也可以没有

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1904865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

驾校管理系统设计

驾校管理系统设计旨在提高驾校运营效率、学员管理、教练安排、考试预约、财务结算等方面的能力。以下是一个基本的设计框架,包括关键模块和数据表设计: 1. 系统架构设计 前端界面:提供给学员、教练和管理员使用的Web界面或移动应用&#xf…

51单片机STC89C52RC——16.1 五项四线步进电机

目的/效果 让步进电机 正向转90度,逆向转90度 一,STC单片机模块 二,步进电机 2.2 什么是步进电机? 步进电机可以理解为:是一个按照固定步幅运动的“小型机器”。它与普通电机不同点在于,普通电机可以持…

插入排序——C语言

假设我们现在有一个数组,对它进行排序,插入排序的算法如同它的名字一样,就是将元素一个一个插入到合适的位置,那么,该如何做呢? 如果我们要从小到大进行排序的话,步骤如下: 1.对于…

WAWA鱼曲折的大学四年回忆录

声明:本文内容纯属个人主观臆断,如与事实不符,请参考事实 前言: 早想写一下大学四年的总结了,但总是感觉无从下手,不知道从哪里开始写,通过这篇文章主要想做一个记录,并从现在的认…

大数据之路 读书笔记 Day4 数据同步

回顾: Day 3 总结了无限客户端的日志采集 大数据之路 读书笔记 Day 3Day 2总结了浏览器端的日志采集 大数据之路 读书笔记 Day 2 数据同步 阿里数据体系中的数据同步,主要指的是在不同的数据存储系统之间进行数据的传输与更新,以保证数据的一…

自用款 复制粘贴工具 Paste macOS电脑适配

Paste是一款专为Mac和iOS用户设计的剪贴板管理工具,它提供了强大的剪贴板增强功能。Paste能够实时记录用户复制和剪切的内容,包括文本、图片、链接等多种数据类型,并形成一个可视化的剪贴板历史记录,方便用户随时访问和检索。此外…

【密码学】密码学中的四种攻击方式和两种攻击手段

在密码学中,攻击方式通常指的是密码分析者试图破解加密信息或绕过安全机制的各种策略。根据密码分析者对明文、密文以及加密算法的知识程度,攻击可以分为以下四种基本类型: 一、四种攻击的定义 (1)唯密文攻击(COA, C…

蚂蚁全媒体总编刘鑫炜谈新媒体时代艺术家如何创建及提升个人品牌

新媒体时代艺术家如何创建及提升个人品牌形象——专访蚂蚁全媒体总编刘鑫炜 图为蚂蚁全媒体总编刘鑫炜 在新媒体风潮席卷全球的今天,传统艺术与新媒体技术的融合越来越紧密。这种变革不仅改变了艺术作品的呈现方式,也给艺术家们提供了更多的可能性。那么…

python 10个自动化脚本

目录 🌟 引言 📚 理论基础 🛠️ 使用场景与代码示例 场景一:批量重命名文件 场景二:自动下载网页内容 场景三:数据清洗 场景四:定时执行任务 场景五:自动化邮件发送 场景六…

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十二)-管道、环境变量、常用命令

大致介绍了一下管道、环境变量、一些常用的基本命令,可以当作学习笔记收藏学习一下!!! 文章目录 前言 一、管道 二、环境变量 1.概念 2.查看 3.修改 4.常用环境变量 三、系统状况 总结 前言 大致介绍了一下管道、环境变量、一些常…

【因果推断】优惠券政策对不同店铺的影响

这次依然是用之前rossmann店铺竞赛的数据集。 之前的数据集探索处理在这里已经做过了,此处就不再赘述了CSDN链接 数据集地址:竞赛链接 这里探讨数据集中Promo2对于每家店铺销售额的影响。其中,Promo2是一个基于优惠券的邮寄活动,发…

ZYNQ-LINUX环境C语言利用Curl库实现HTTP通讯

前言 在Zynq-Linux环境中,需要使用C语言来编写APP时,访问HTTP一般可以使用Curl库来实现,但是在Zynq的SDK中,并没有集成该库,在寻找了很多资料后找到了一种使用很方便的额办法。这篇文章主要记录一下移植Curl的过程。 …

将iStoreOS部署到VMware ESXi变成路由器

正文共:888 字 19 图,预估阅读时间:1 分钟 前面把iStoreOS部署到了VMware workstation上(将iStoreOS部署到VMware Workstation)。如果想把iStoreOS直接部署到ESXi上,你会发现转换镜像不能直接生成OVF或者OV…

Redis源码整体结构

一 前言 Redis源码研究为什么先介绍整体结构呢?其实也很简单,作为程序员的,要想对一个项目有快速的认知,对项目整体目录结构有一个清晰认识,有助于我们更好的了解这个系统。 二 目录结构 Redis源码download到本地之后,对应结构如下: 从上面的截图可以看出,Redis源码一…

【2024_CUMCM】T检验、F检验、卡方检验

T检验 T检验主要用于比较两组数据的均值差异,适用于小样本数据分析。它可以分为单样本T检验、独立样本T检验和配对样本T检验。 单样本T检验用于比较一个样本与已知的总体均值差异,独立样本T检验用于比较两个独立样本的均值差异,配对样本T检…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【21】【购物车】

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【21】【购物车】 购物车需求描述购物车数据结构数据Model抽取实现流程(参照京东)代码实现参考 购物车需求描述 用户可以在登录状态下将商品添加到购物车【用户购物…

从FasterTransformer源码解读开始了解大模型(2.1)代码通读03

从FasterTransformer源码解读开始了解大模型(2.2)代码解读03-forward函数 写在前面的话 本篇的内容继续解读forward函数,从650行开始进行解读 零、输出Context_embeddings和context_cum_log_probs的参数和逻辑 从653行开始,会…

Python实现ABC人工蜂群优化算法优化随机森林回归模型(RandomForestRegressor算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 人工蜂群算法(Artificial Bee Colony, ABC)是由Karaboga于2005年提出的一种新颖的基于群智能的全局优化…

LeetCode Hard|124.二叉树中的最大路径和

力扣题目链接 题目解读: 二叉树路径的定义即从1.任意节点出发,到达任意节点;2.该路径至少包含一个节点,且不一定经过跟节点;3.求所有可能路径和的最大值。 也就是说路径途径一个节点只能选择来去两个方向 考虑一个二叉…

微信公众平台测试账号本地微信功能测试说明

使用场景 在本地测试微信登录功能时,因为微信需要可以互联网访问的域名接口,所以本地使用花生壳做内网穿透,将前端服务的端口和后端服务端口进行绑定,获得花生壳提供的两个外网域名。 微信测试账号入口 绑定回调接口 回调接口的…