簡體   English   中英

使用錯誤的包名編譯.java文件

[英]Compiling a .java file with incorrect package name

在Boyarsky和Selikoff的“OCA Oracle認證助理Java SE 8程序員I學習指南考試1Z0-808”一書中,我在第一章的復習考試中遇到了一個令人困惑的問題:

14.給定/my/directory/named/A/Bird.java文件中的以下類:

INSERT CODE HERE public class Bird { }

如果我們從/ my /目錄編譯, 以下哪個替換 INSERT CODE HERE (選擇所有適用的選項)

A. package my.directory.named.a;

B. package my.directory.named.A;

C. package named.a;

D. package named.A;

E. package a;

F. package A;

G. Does not compile

該書指出正確的答案只是D.(我們將忽略他們寫下“選擇所有適用的”這一事實,盡管他們只會在書中前面有超過1個答案的情況下才會這樣做)說明:

D.包名稱表示當前路徑下面的任何文件夾,在這種情況下命名為.A。 選項B不正確,因為包名稱區分大小寫,就像變量名稱和其他標識符一樣。

我在各個層面上對此完全感到困惑:

  1. 我嘗試使用javac /named/A/Bird.java從/ my /目錄編譯文件,代碼使用上面的任何答案成功編譯。 此外,無論我在類的第一行中的package之后編寫什么,代碼都會編譯。

  2. 讓我們假設我完全錯過了第1點(沒有雙關語)點,這不是我們從/ my /目錄編譯的方式 ,然后我有這些問題:

    • 我們如何從/ my /目錄編譯

    • 為什么選項B.不正確? 他們為B.提供的解釋顯然沒有意義。

有人可以解釋一下這件事嗎?

簡短的回答是問題是錯誤的。

可以從任何地方編譯單個類, 如果沒有對其他自定義類的引用(因此可以使用String等),則不考慮包層次結構。 這是因為它不需要對其他類進行任何查找,因此在編譯時類路徑中不需要任何特殊的東西。 一旦你添加了一個named.A.Rock類的named.A.Rock ,編譯將不再起作用,因為目錄層次結構與包層次結構不匹配(除非你將Bird放在named.A包中)。

所以問題中的例子很糟糕。 只要添加對另一個類的引用並且包層次結構開始重要, D就是正確的答案。 問題有點差,因為您可以顯式設置編譯時類路徑,此時“當前目錄”的概念無關緊要,所有答案都是有效的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM