包和 jar 文件的创建

2023-11-16

前言

在之前的文章中,讲到了面向的 3 大特性(封装、继承、多态)和面向对象设计的 5 大原则(SRP、OCP、LSP、DIP、ISP)。此外,我们还讲了如何创建一个类,并且在创建类后如何构造一个对象。然后还介绍了类中的属性和方法,并对构造方法和引用也做了简单的讲解。

有了上面的基础之后,今天我们来继续学习面向对象的相关知识,主要内容预告如下:

  • 注释
  • jar 文件的创建

假设现在有这么一种情况,诸葛亮、周瑜、曹操共同开发一款程序。其中,周瑜和曹操均在自己代码模块中写了一个 PublicUtil 类,现在诸葛亮要调用周瑜和曹操模块中代码,需要同时用到他们中的 PublicUtil 类,这时候就犯难了,诸葛亮在他的代码中使用 PublicUtil 类时,该怎么区分是调用周瑜的,还是调用的曹操的呢?

针对这个问题,开发 Java 的前辈们当然也想到了。于是,他们在 Java 中定义了一种名字空间,也就是我们今天要讲的包:package。通过使用包机制,就十分容易区别类名的命名空间了。

假设曹操的 PublicUtil 类代码如下:

// 申明包名
package caocao;
public class PublicUtil{
    ……
}

周瑜的 PublicUtil 类代码如下:

// 申明包名
package zhouyu;
public class PublicUtil{
    ……
}

此时,如果诸葛亮要同时使用他们俩代码中的 PublicUtil 类,此时就可以通过引入他们俩的包,然后通过使用 包名.类名 的引用方式来进行区分即可。

package zhugeliang;
import caocao;
import zhouyu;
public class Util{
    // 使用周瑜代码
    zhouyu.PublicUtil.xxx();
    ……
    // 使用曹操代码
    caocao.PublicUtil.xxx();
    ……
}

以上代码中的 import 你可能也在其他代码中见到过,但你不知道啥作用。其实它就是为了包的使用而生,如果我要使用另一个人的包,那该怎么做呢?其实很简单,只需要在程序中使用关键字 import 即可完成包的导入。

通过使用包,可以达到以下的作用:

  1. 将功能类似或或相关的类以及接口组织放在同一个包中,方便类的查找与使用。
  2. 包也像文件夹一样,采用了树形目录的存储方式。同一个包中的类名不同,不同包中的类名可以相同。当同时调用两个不同包中的同一类名的类时,通过加上完整的包名就可以加以区分,从而避免类名冲突。
  3. 同时包也限定了访问权限,只有拥有包访问权限的类才能间接去访问包中的类。

注释

所谓注释,就是写在程序里边对代码进行结束说明的文字,既方便自己也方便他人查看,更快理解程序含义。而且注释是不影响程序的执行的,在我们对 Java 源代码进行编译后,字节码文件中不含源代码中的注释内容。

在 Java 中,通常支持三种注释方式,它们分别是:

  • //:单行注释
  • /* */:多行注释
  • /** */:文档注释

单行注释

单行注释是以双斜杠 // 来标识,表示只注释当前行内容,一般用在需要注释的内容较少的地方,以下就是一个单行注释的实例。

// 第一个 Java 程序
public class HelloWorld{
	public static void main(String[] args){
    	System.out.println("Hello World!");
    }
}

多行注释

通常我们把要注释的内容放在 /**/ 之间,表示在两者之间的内容都是我们的注释内容,以下是一个多行注释的实例。

/*
* 第一个 Java 程序
* 这是许多初学者都会写的一个程序
*/
public class HelloWorld{
	public static void main(String[] args){
    	System.out.println("Hello World!");
    }
}

文档注释

文档注释和多行注释很像,它是将我们所需要注释的内容包含在 /***/ 之间。而文档注释和其他两种注释最大的区别就在于:我们可以利用 javadoc 工具来提取文档注释,然后生成一个 HTML 文档,类似于 Java 官网所提供的 API 文档,以下是一个文档注释的实例。

/**
* 第一个 Java 程序
* 这是许多初学者都会写的一个程序
*/
public class HelloWorld{
    /**
    * 主函数
    * @param args 主函数参数列表
    */
	public static void main(String[] args){
    	System.out.println("Hello World!");
    }
}

然后我们通过终端,使用 javadoc 命令就可以为上述文件生成一个 HTML 文档。

javadoc HelloWorld.java

而文档注释相比于其他两种注释,也有更多值得注意的地方,下面就分别来看看需要留意的地方。

  1. 常用文档注释分类
  • 类注释

顾名思义,所谓类注释,就是针对整个类的说明,它必须放在 import 之后,但又必须放在类定义之前。以下是一个类注释的实例:

/**
* Animal,动物类
*/
public class Animal{
	...
}

这里需要注意的是,在 /***/ 之间的其他行注释,* 是可有可无的,之所以加上,更大情况出于美观的考虑,上面的实例写成如下样式也是合法的。

/**
  Animal,动物类
*/
public class Animal{
	...
}
  • 方法注释

同样的,方法注释也就是针对类中方法的注释,它必须放在所描述的方法之前。而一般情况下,除开说明该方法的功能之外,我们经常使用如下标记来对方法进行注释。

标记 说明
@param variable description 用于介绍当前方法的参数,可以占据多行
@return description 用于描述当前方法的返回值,可以跨多行
@throws class description 用于表示该方法有可能抛出的异常

以下就是一个方法注释的实例:

/**
* 求两数之h
* @param num1 加数1
* @param num2 加数2
@ return 两数之和
*/
public int add(int num1, int num2){
	return num1 + num2;
}
  • 字段注释

字段注释顾名思义,也就是对于类中字段的说明,用于描述字段的含义,以下是一个字段注释的例子。

public class Cunyu{
	/**
	* 公众号
	*/
    public String wePublic;
}

当然,如果你不喜欢把一个字段的注释分成多行的话,也可以写成以下格式。

public class Cunyu{
	/**公众号*/
    public String wePublic;
}

两种方式都是可以的,也没有优劣之分,可以根据自己的风格来选择。但是在 IntelliJ IDEA 等 IDE 中,如果对代码进行格式化,IDEA 会将第二种方式格式化成第一种方式,这一点需要注意。

  1. 如何提取文档注释

假设有以下一段代码,我们需要生成关于代码的文档说明。那么就可以使用 JDK 中所提供的 javadoc 命令来提取代码的文档注释。

/**
* 第一个 Java 程序
* 这是初学者基本都会写的一个程序
* @author 村雨遥
* @version 1.0
*/
public class HelloWorld {
    /**
    * 主函数:程序入口
    * @param args 主函数参数列表
    */
	public static void main(String[] args){
    	System.out.println("Hello World!");
    }
}

然后利用以下命令就可以生成我们的文档注释。

javadoc -d helloworld -author -version -encoding UTF-8 HelloWorld.java

以上命令的意思就是,对名为 HelloWorld.java 的提取其中的文档注释,并将输出的文件放在 helloworld 文件夹下,并且在文档中包含程序作者和版本,编码方式为 UTF-8

生成的文件列表详情见下图,打开其中的 index.html 就可以查看提取的文档注释。

jar 文件的创建

其实关于这个,我在之前的文章也写过。不过我是利用 IntelliJ IDEA 来对进行代码的打包,如果感兴趣,可以点击下方传送门去看看。

如何利用 IntelliJ IDEA 创建 Java 入门应用

不过那是借助工具来生成的,今天我们来看看如何利用 JDK 所提供的命令行工具,来创建一个能打印出 Hello World!jar 包。

同样的,我们仍然是需要先准备一个能输出 Hello World! 的 Java 源代码,命名为 HelloWorld.java

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

接着,利用 javac 命令对该文件进行编译,然后会生成 HelloWorld.class 字节码文件。

javac HelloWorld.java

然后,利用 jar 命令来对生成的字节码文件进行打包。

jar -cvf hello.jar HelloWorld.class

其中 c 表示创建一个新 jar 包,v 表示创建过程中打印创建过程中的信息,f 则表示对新生成的 jar 命名。

最后,利用以下命令来运行 jar 包。

java -jar hello.jar

不过并不会顺利出现我们想要的结果,此时会报错 hello.jar 中没有主清单属性。这是因为我们还没有在 MENIFEST.MF 文件中添加 Main-Class 属性。

用压缩软件打开刚创建的 hello.jar,里边除了 HelloWorld.class 文件之外,还会多一个 META-INF 文件夹,里边还有一个 MENIFEST.MF 文件,此时我们只需要用编辑器打开该文件,然后在文件中加入以下代码。(记得添加之后要保证整个文件最后保留一行空行

Main-Class: HelloWorld

添加完成之后,再次运行 java -jar hello.jar ,就可以成功在控制台打印 Hello World! 了。

总结

以上就是今天博客的所有内容了,如果您觉得本文不错,那就来个一键三连吧,您的关注就是我坚持的不懈动力!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

包和 jar 文件的创建 的相关文章

随机推荐

  • 合并两个有序链表(精美图示详解哦)

    全文目录 引言 合并两个有序链表 题目描述 方法一 将第二个链表合并到第一个 思路 实现 方法二 尾插到哨兵位的头节点 思路 实现 总结 引言 在前面两篇文章中 我们介绍了几道链表的习题 反转链表 链表的中间结点 链表的倒数第k个结点 戳我
  • 深度学习实战28-AIGC项目:自动生成定制化的PPT文件

    大家好 我是微学AI 今天给大家介绍一下深度学习实战28 AIGC项目 自动生成定制化的PPT文件 AIGC项目是一个基于自然语言处理技术的创新性项目 旨在利用ChatGPT模型生成定制化的PPT文件 该项目主要应用于商务和教育领域 可以帮
  • 中文NLP的第二步:分词转词表ID,基于 PaddleHub 实现(学习心得)

    上一步我们做了分词 中文NLP的第一步 分词 基于 PaddleHub 实现 绝对小白友好 学习心得 第二步是把分词结果 对照词表转化成 ID 词表是什么呢 首先我们要知道 中文字符是没办法直接计算的 更不要说进一步的操作了 所以我们需要的
  • qmake常用语法

    qmake常用语法 一 注释 用 注释 表示到行尾均为注释 二 include 包含别的文件 例如 include xx pri 类似于c 的 include 三 平台宏 win32 macx unix linux g 等 分别对应于win
  • HDU--1864:最大报销额 DP求最大和(最大和有上限)

    1 题目源地址 http acm hdu edu cn showproblem php pid 1864 2 简要分析 这道题看起来不难 求最大报销额 想法是先找到符合要求的发票 然后求符合要求的发票的最大报销金额 但是 这道题的陷阱好几个
  • 【目标检测】3、SPPNet

    SPPNet Spatial Pyramid Pooling 空间金字塔池化 一般的CNN结构中 对输入大小要求固定 但在现实中通常会使用crop和warp来将大小统一 这样做会破坏图像的纵横比 何凯明提出了SPP 连接在最后一层卷积层 下
  • C++ 算法学习 之 sort

    这里写目录标题 sort函数 简单使用 通过上面的两个列子发现sort用的参数不一样为什么 进一步理解sort 那我们怎么进行自定义排序呢 力扣题目 c 官网手册 sort 参考于官网 sort函数 std sort 函数是C 标准库中提供
  • Python3.7+RobotFramework自动化测试框架环境搭建-重装

    Python3 7 RobotFramework自动化测试框架环境搭建 学习笔记 一 环境搭建 1 安装Python3 7 2 2 安装相关的库 request库 robotframework库 robotframework request
  • C++实现softmax函数(std::vector)

    参考博客 激活函数之softmax介绍及C 实现及其评论区 Lambda使用参考博客 C 11 Lambda表达式 函数功能 输入vector
  • CSS(三)

    目录 CSS三大特性 层叠性 继承性 优先级 层叠性 继承性 优先级 页面布局三大核心 盒子模型 浮动 定位 CSS盒子模型 网页布局过程 盒子模型组成 编辑 编辑 边框 border 内边距 padding 外边距 margin PS基本
  • 基于github搭建的个人博客

    刚开始我也是很不理解为什么要利用github hexo搭建博客 现在差不多能理解 首先逼格很高 其次用github搭建可以学习使用github并且空间很大 也可以便于交流 再次声明本篇是基于windows系统下搭建的博客 废话不多说开始 搭
  • 借助Redis锁,完美解决高并发秒杀问题

    目录 1 单机环境下的锁 2 分布式情况下使用Redis锁 3 一台服务宕机 导致无法释放锁 4 给每一把锁加上过期时间 5 延长锁的过期时间 解决锁失效 6 使用Redisson简化代码 场景 一家网上商城做商品限量秒杀 1 单机环境下的
  • JAVA-注册成功后,通过多线程发送短信的使用场景

    场景 在日常的系统中 使用前的第一步往往是需要注册 只有注册后获得登录账号和密码才能正常使用系统 有些系统在注册成功后 还会往用户的手机发送一条注册成功的短信通知 这个并不属于主线流程 也就是说发不发送该短信通知 用户都已经能登录系统了 那
  • mapbox创建自定义marker图标绑定弹框展示信息

    创建自定义marker图标绑定弹框 let carMarker 存放marker图标 for let m 0 m
  • 怎么查看本地服务器信息,查看本地服务器url地址

    查看本地服务器url地址 内容精选 换一换 OBS Browser 是一款用于访问和管理对象存储服务的图形化工具 支持通过配置内网DNS服务器地址的方式 使在华为云上的Windows ECS通过内网直接访问OBS 下面将介绍具体其操作流程和
  • Android EditText的setOnEditorActionListener方法——监听软键盘按键

    文章目录 1 控件EditText的setOnEditorActionListener方法的使用 2 android 软件盘事件响应 android imeOptions KeyEvent android inputType 2 1 Edi
  • 修改NuGet下载包后存放的默认路径

    NuGet默认下完包后就放在C盘 我们给他改一下 NuGet的默认目录配置文件在C Users yourName AppData Roaming NuGet NuGet Config 加一下这个配置 我放在了D盘 你可以看情况自己改
  • 【Hadoop技术篇】hadoop的使用

    博主介绍 博主介绍 大家好 我是淼淼 喵 很高兴认识大家 主攻领域 大数据开发 数据仓库 ETL 数据分析 面试分析 点赞 评论 收藏 养成习惯 一键三连 欢迎关注 一起学习 一起讨论 一起进步 欢迎评论 作者水平有限 欢迎各位大佬指点 相
  • 沐神《动手学深度学习》报错 解决方案RuntimeError: DataLoader worker (pid(s) ...) exited unexpectedly

    3 6 softmax回归的从零开始实现 运行 print evaluate accuracy net test iter 报了一溜错误 其中最后一行为 RuntimeError DataLoader worker pid s 5052 1
  • 包和 jar 文件的创建

    前言 在之前的文章中 讲到了面向的 3 大特性 封装 继承 多态 和面向对象设计的 5 大原则 SRP OCP LSP DIP ISP 此外 我们还讲了如何创建一个类 并且在创建类后如何构造一个对象 然后还介绍了类中的属性和方法 并对构造方