编写代码

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.javaPackageTest2.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包结构编译与执行相关推荐

  1. 【Java】命令行下的Java模块化建构、编译与执行

    编写代码 module-info.java module com.hhh.module_test {} ModuleTest.java package com.hhh.module_test;publ ...

  2. 命令行下运行 java someClass.class出现 “错误:找不到或无法加载主类someClass ” 的解决方案

    命令行下运行 java someClass.class出现 "错误:找不到或无法加载主类someClass " 的解决方案 参考文章: (1)命令行下运行 java someCla ...

  3. java命令行参数args_Args4J (Java 命令行参数控制开源项目) 使用指南

    Args4J 使用指南 Args4J 是一个用来出来命令行的工具. 在实际的项目中用到命令行的并不是很常见,但当真正使用到时,特别是在程序启动时配置一下参数的时候就很有用了,如果参数很多的话,一个一个 ...

  4. 在linux命令行 下学习编写java

    对于新手来讲, 使用eclipse 等IDE来学习java是最为方便和效率的. 学习Java能令程序猿深刻地理解面向对象的编程思想 . 但Java 是一个跨平台的编程语言. 本文介绍下在命令行下学习j ...

  5. linux抓包命令tcptrace,每天学习一个命令:tcpdump 命令行下抓包

    tcpdump 是一个运行在命令行下的抓包工具,如果想知道网络中有什么在流通,那么 tcpdump 就是一个很好的工具.它允许用户拦截和显示发送或收到过程中网络连接到该计算机的 TCP/IP 和其他数 ...

  6. 打成jar包 在命令行下执行java工程

    将java工程打成jar包,但第三方jar包并没有包含在包中,当在命令行中运行jar包时,出现类找不到的异常, 在网上看到解决办法是将第三方jar包放到JDK的扩展类文件夹中(%JAVA_HOME%/ ...

  7. java运行class文件_java命令行下运行class文件

    今天碰到了一个很变态的问题,写了一个很简单的HelloWord.java,内容如下: package com.yanjiuyanjiu; public class HelloWorld { publi ...

  8. java命令行执行程序解决依赖外部jar包的问题

    java命令行执行程序解决依赖外部jar包的问题 参考文章: (1)java命令行执行程序解决依赖外部jar包的问题 (2)https://www.cnblogs.com/wangxiaoha/p/6 ...

  9. android运行jar文件路径,java命令行执行jar包报错解决

    今天遇到一个问题,在终端doc命令行下,执行java -jar 操作,报错Error: Unable to access jarfile CheckAndroidV2Signature.jar 找了各 ...

最新文章

  1. 【OpenCV】将单通道的Mat对象转换为三通道的Mat
  2. 半导体产业格局:行稳而致远,强者将恒强
  3. html/jquery 常用的输入与获取参数
  4. OSError: [WinError 126] 找不到指定的模块————Shapely
  5. mysql group by join_mysql – GROUP BY之后的LEFT JOIN?
  6. Xshell替代品 -- FinalShell
  7. 计算机c语言期末答案,大学计算机C语言期末考试试题A.doc
  8. malloc()与 alloc()区别(转)
  9. ukey证书是什么意思_什么是证书?
  10. 淘特淘宝淘金币助手软件,每天自动完成任务领取淘金币
  11. srun Invalid account or account/partition combination specified
  12. 《Python+Kivy(App开发)从入门到实践》自学笔记:Python文件+.kv 文件实现“Hello world”
  13. LCS(最大公共子序列)问题
  14. 暑期2020“大咖说开源” | 陈莉君:Linux从入门到深入内核有多远
  15. 【整理】TAC码是什么?TAC码和IMEI有什么关系?
  16. 一文讲透智慧农业,一滴水也没有的超级干货
  17. 云计算是什么意思,还是先了解一下云计算技术的基本概念
  18. (转) 阿拉贡的故事
  19. OpenCppCoverage 引起测试程序Crash问题
  20. 【免费学习半个月】强烈推荐你学习这个《机器学习与推荐系统实训强化课》...

热门文章

  1. photoshop切图
  2. 翻译:通向T-SQL的阶梯:超越基础水平3:建立相关子查询
  3. Linux命令之乐--sed
  4. 5.Lock接口及其实现ReentrantLock
  5. javaScript命名规范
  6. 安装CentOS6.2操作系统
  7. 授人以鱼不如授人以渔,UCHome全面大解析培训活动【第三集】
  8. 使用sqoop从Oracle或mysql抽取数据到HDFS遇到的报错及解决
  9. Apache Kylin原理学习之Cube的创建与Build
  10. eclipse实现Android登录功能,eclipse开发安卓登录