【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包结构编译与执行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【操作系统】大内核和微内核的比较
- 下一篇: 【软件测试】结构化分支和循环语句的白盒测