2017-07-06 116 views
2

我開始學習面向對象和繼承的原則,我碰到這個問題就來了,而寫一些代碼:Java如何知道在這個例子中使用哪個類?

假設有包含一個名爲ClassA類包。然後,在另一個文件夾中,我有另一個名爲MyClass的類。在與MyClass相同的文件夾中,我有另一個名爲ClassA的類,它與包中的ClassA無關。當我爲MyClass編寫代碼時,我將它擴展爲ClassA。

MyClass從哪個ClassA擴展而來? MyClass繼承了導入包中的ClassA,還是MyClass繼承了與MyClass位於同一文件夾中的ClassA?代碼是否會編譯?

我想從理論角度理解這個,然後再深入示例。

+2

查看'import'聲明和_scope_。 –

+1

類由_package_ + _class name_唯一組合標識。這強制MyClassA不能在同一個包中出現兩次,因此導入語句只能選擇一個。 –

+0

@LucianovanderVeekens沒有稱爲MyClassA的類。只有MyClass和ClassA。你什麼意思? –

回答

1

你正在看的是一種靜態範圍的語言,它將從其內部範圍,一直到它的外部範圍。 在這種情況下,由於導入類A直接在它首次調用的文件內聲明,因此它將使用導入類A並停止。這將是其默認行爲。 它不會繼續查看打包的類A,因爲它已經發現了一個,它在同一個類文件中聲明。

這是java(靜態)作用域分層結構的默認行爲。

如果它沒有找到在同一個文件中導入的類A的導入,它會與它的包聯繫以搜索一個。

這就像聲明變量時是非常有用的。對靜態範圍語言如何工作做一點研究。

如果你理解起來比較容易,你可以明確地表達你的意圖,通過聲明你確切的A類。

只是一個側面說明 - 這是一個編程語言更多的問題,而不是直接的java問題,但由於你問專門爲java,我們只需要覆蓋簡單的具體答案。如果你想知道更多,我可以指導你(或告訴你)更多關於靜態和動態範圍的語言。

我認爲值得注意的是,如果你決定從你的包中導入兩個類(你不需要這樣做),你將不得不明確地聲明你想要的。

0

Java中的包是封裝一組類的機制, 接口和子包。 Java的許多實現都使用分層文件系統來管理源文件和類文件。很容易 將類文件組織成包。我們所需要做的就是將 相關的類文件放在同一個目錄中,爲該目錄指定一個與類的用途相關的名稱 ,並在每個聲明包名的類文件的頂部 中添加一行,與它們所在的目錄名稱是相同的 。

在java文件頂部

,你有進口,您可以選擇您的意思是什麼包什麼類課程作爲@Jason說太多,如果你想要的類它在你的包,你不需要告訴它明確地和編譯器知道,但如果它在另一個包中,你必須明確地告訴他。

假設你有src文件夾FirstClass.java,另一個在mycodes文件夾時,在你的類,你import FirstClass你的意思FirstClass.java存在於src文件夾,當你import mycodes.FirstClass你的意思是在mycodes文件夾中的Firstclass。

你的類可以是packag.when您擴展類,您類是包的成員,當你擴展SomeClass的你的意思SomeClass的是在包裝A,如果你想擴展其他類,在其他包一樣B你必須擴展B.SomClass

Here是關於Java的

+1

太複製和粘貼信息摘要... – user3685285

+0

我真的認爲OP的默認意思是哪個範圍先行而不是明確聲明哪種方式類 –

+0

你是不正確的我的朋友。研究靜態範圍的語言,你會發現有一個答案。 –

1

包在這種情況下另一個信息,使之完全清楚,你可能會想要做這樣的事情extends otherPackage.ClassA編譯器,並使用完整的參考名稱延長來自另一個包的classA。如果你想使用MyClass包中的那個,那麼就不要導入其他ClassA並且不要導入其他的ClassA並且執行extends ClassA

0

既然你是新的節目,我要解釋一下很簡單的話。假設有一個名爲Salads的軟件包。在這個包中,你有一個叫做Caesar的類。然後,你有另一個包叫People。在這個包中,你有另一個類叫做Caesar。顯然,Salads.Caesar是指凱撒沙拉,而People.Caesar是指一個名叫凱撒的人。但是這兩個班都有相同的名字:Caesar

因此,當你編寫Java代碼時,Java在兩個地方的類定義:在同一個文件夾中定義

  1. 類(因爲它們是隱含在同一個包,如果他們是在同一文件夾假設您遵守所有的一般規則。在任何導入包

所以,問題是,如果你只是說Caesar代碼詢問定義

  • 類,將其識別爲一個相同的文件夾或者中的一個進口包裝?那麼,這是一個不好的問題,因爲首先,你不應該模糊地命名你的類。其次,如果無法提供幫助,則應始終在代碼中引用完全限定的名稱。

    如果您的意思是People.Caesar,請鍵入People.Caesar,如果您的意思是Salads.Caesar,請鍵入Salads.Caesar。不要採取捷徑。如果沒有歧義,你只能採取快捷方式。無論如何,編譯器可能會抱怨它要求你指定。除非您將Caesar的所有引用更改爲Salads.CaesarPeople.Caesar,否則您的代碼將無法使用。

  • 相關問題