【Java】命令行下的Java包结构编译与执行
编写代码
com.hhh.test.PackageTest
package com.hhh.test;public class PackageTest {public static void main(String[] args) {System.out.println("Hello World");}
}
com.hhh.test2.PackageTest2
package com.hhh.test2;import com.hhh.test.PackageTest;public class PackageTest2 {public static void main(String[] args) {PackageTest obj = new PackageTest();System.out.println("Hello World");}
}
预处理
跳转到指定区域
PackageTest.java
、PackageTest2.java
文件放到D:\PackageTest
路径下。- cmd输入
D:
,从C盘切到D盘。 - 输入命令
cd D:\PackageTest
,跳转到指定路径下。
编译第一个文件
输入命令javac PackageTest.java
,编译第一个文件,生成PackageTest.class
。
编译第二个文件
输入命令javac PackageTest2.java
,编译第二个文件,却报错了:
其实我们import了啊,但为什么找不到呢?
看错误原因:程序包com.hhh.test不存在!
不知道大家在使用Eclipse、IDEA等IDE的时候记不记得那包结构看起来就是一层一层的“文件夹”?
所以啊,你看看我们这里,哪有个文件夹嘛?
更正编译指令,重新编译程序一
输入命令javac -d . PackageTest.java
,重新编译第一个文件,生成包结构的“文件夹”。
我们逐层打开看看是什么样子:
这才是真正的把包结构弄出来了。
重新编译程序二
输入命令javac PackageTest2.java
,编译第二个文件,生成PackageTest2.class
。
使用-d .
可以达到预期,并且发现com和hhh果真是合并在一起的,只是test和test2分列两个文件夹:
运行程序一
如下运行,报错,找不到Class文件,无法加载主类(请注意:已编译完成,所以不要去找.java。JVM解释执行的是.class):
于是想到,实际上在命令行使用包结构的时候必须要使用包全名才能执行,且不需要跳到.class文件的具体路径:
运行程序二
探究自建文件夹是否有效
我们先不使用-d .
,而是进行普通的编译,然后自己新建文件夹,把编译好的.class放进去,再执行:
得到了同样的结果,也就是可执行的,是有效的。
探究拆了文件夹能否执行
其实根据PackageTest2.java编译通不过这件事我们就能推测出这肯定不能执行,但实践出真知嘛:
果然,不行的呢!
对package的思考
package为何而存在
为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。
package的作用
- 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
- 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
- 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
Java与package
Java 使用包(package)这种机制是为了防止命名冲突,进行访问控制,便于搜索和定位类(class)、接口(interface)、枚举(enumeration)和注解(annotation)等。
package既是一种机制、一种结构,也是一个关键词。
我们编写一个类的时候,.java源文件的顶部就是package package1[.package2[.package3[…]]];
这种语法格式,其中package正是我们说的那个关键词。
在导入包的时候就要用import,语法格式是:import package1[.package2[.package3[…]]].ClassName;
。当然也有 import static 这种操作,此处就不提了。
使用包结构的内在逻辑思考
上面对包的总结,都是一些冠冕堂皇的废话,我说点实在的感悟。
想到起初在学校做课设项目的时候,要求使用“三层架构”。
由于很多同学并没有接触过这方面的东西,也没有经验,所以就不分包或者胡乱分包。更有意思的是有的人为了“得分,分出了.dao、.service、.view等包,实则毫无逻辑地乱写一通,只是为了欺骗验收老师多刷点GPA。我们可不能那样,还是要尽早地去努力理解呀。
包结构不论怎么说,完成了物理结构上的分包,通过把文件分在不同的目录结构,避免了命名冲突。
怎么分呢?其实背后是逻辑的分层。
我们可以先分层,把不同的层分在不同的包里;再分逻辑,按照业务逻辑分出各个模块,按照模块名在表示层的包结构里再分子包。分到这个程度,才能说基本是分好了包结构。而模块的划分,源自对需求和业务逻辑的理解,有时会分出几级子模块。
如果你能理解明白每个层的作用、明确每个模块的划分,你就能更好地完成包结构划分了。多看看好的包结构划分,熟能生巧,你就会操作了。
其实这种使用物理分包来完成业务逻辑划分的方式不是那么好,所以就有了Java9的模块化,包仍然存在,但包不再是业务逻辑的唯一划分了,也会更好的吧。这方面我也没什么经验,就不多说了吧。
总结
我们使用javac、java命令分别完成了带有包结构的Java程序的编译和执行,亲手操作了一次IDE帮我们省略的工作,虽不复杂,但很棒的不是吗?
我们不能只会使用IDE这种开发工具,越是强大的IDE,往往越是隐去了更多我们的基本操作,对于掌握知识未必是好事。
本文的核心是:手把手地教大家使用命令行完成与Java包结构相关的建构、编译、调用、运行。
文末对package特别是Java的package进行了总结,并浅谈自己对于包结构的理解。
希望能对大家有所帮助吧!
【Java】命令行下的Java包结构编译与执行相关推荐
- 【Java】命令行下的Java模块化建构、编译与执行
编写代码 module-info.java module com.hhh.module_test {} ModuleTest.java package com.hhh.module_test;publ ...
- 命令行下运行 java someClass.class出现 “错误:找不到或无法加载主类someClass ” 的解决方案
命令行下运行 java someClass.class出现 "错误:找不到或无法加载主类someClass " 的解决方案 参考文章: (1)命令行下运行 java someCla ...
- java命令行参数args_Args4J (Java 命令行参数控制开源项目) 使用指南
Args4J 使用指南 Args4J 是一个用来出来命令行的工具. 在实际的项目中用到命令行的并不是很常见,但当真正使用到时,特别是在程序启动时配置一下参数的时候就很有用了,如果参数很多的话,一个一个 ...
- 在linux命令行 下学习编写java
对于新手来讲, 使用eclipse 等IDE来学习java是最为方便和效率的. 学习Java能令程序猿深刻地理解面向对象的编程思想 . 但Java 是一个跨平台的编程语言. 本文介绍下在命令行下学习j ...
- linux抓包命令tcptrace,每天学习一个命令:tcpdump 命令行下抓包
tcpdump 是一个运行在命令行下的抓包工具,如果想知道网络中有什么在流通,那么 tcpdump 就是一个很好的工具.它允许用户拦截和显示发送或收到过程中网络连接到该计算机的 TCP/IP 和其他数 ...
- 打成jar包 在命令行下执行java工程
将java工程打成jar包,但第三方jar包并没有包含在包中,当在命令行中运行jar包时,出现类找不到的异常, 在网上看到解决办法是将第三方jar包放到JDK的扩展类文件夹中(%JAVA_HOME%/ ...
- java运行class文件_java命令行下运行class文件
今天碰到了一个很变态的问题,写了一个很简单的HelloWord.java,内容如下: package com.yanjiuyanjiu; public class HelloWorld { publi ...
- java命令行执行程序解决依赖外部jar包的问题
java命令行执行程序解决依赖外部jar包的问题 参考文章: (1)java命令行执行程序解决依赖外部jar包的问题 (2)https://www.cnblogs.com/wangxiaoha/p/6 ...
- android运行jar文件路径,java命令行执行jar包报错解决
今天遇到一个问题,在终端doc命令行下,执行java -jar 操作,报错Error: Unable to access jarfile CheckAndroidV2Signature.jar 找了各 ...
最新文章
- 【OpenCV】将单通道的Mat对象转换为三通道的Mat
- 半导体产业格局:行稳而致远,强者将恒强
- html/jquery 常用的输入与获取参数
- OSError: [WinError 126] 找不到指定的模块————Shapely
- mysql group by join_mysql – GROUP BY之后的LEFT JOIN?
- Xshell替代品 -- FinalShell
- 计算机c语言期末答案,大学计算机C语言期末考试试题A.doc
- malloc()与 alloc()区别(转)
- ukey证书是什么意思_什么是证书?
- 淘特淘宝淘金币助手软件,每天自动完成任务领取淘金币
- srun Invalid account or account/partition combination specified
- 《Python+Kivy(App开发)从入门到实践》自学笔记:Python文件+.kv 文件实现“Hello world”
- LCS(最大公共子序列)问题
- 暑期2020“大咖说开源” | 陈莉君:Linux从入门到深入内核有多远
- 【整理】TAC码是什么?TAC码和IMEI有什么关系?
- 一文讲透智慧农业,一滴水也没有的超级干货
- 云计算是什么意思,还是先了解一下云计算技术的基本概念
- (转) 阿拉贡的故事
- OpenCppCoverage 引起测试程序Crash问题
- 【免费学习半个月】强烈推荐你学习这个《机器学习与推荐系统实训强化课》...