2010-04-25 53 views
2

我是新來的Java和HW任務,我們必須創建一個Person類,該類具有構造函數,getter/setter用於firstName,lastName,phone的屬性。這是與舊的硬件分配(Person.java)分開的文件。現在我們必須在新的HW分配中使用該Person類(LoanApplication.java)。所以如果其中一個屬性是從Java中單獨的類文件獲取/設置器

private Person client 

我需要重新創建getter/setters還是構造函數?否則,每個LoanApplicaiton實例如何知道它將與哪個Person屬性一起使用?

即使我的LoanApplicaiton.class不擴展Person.class,JVM如何知道它可以使用Person.class?謝謝。

回答

0

沒有,假設您在Person.java寫道class Person得當,你可以在LoanApplication.java用它class LoanApplication。此時,Person.java不需要修改,但您必須確保Java編譯器可以在編譯LoanApplication.java時找到它。

這意味着您可能需要添加一些import語句,或者更簡單地說,也許您只需將Person.java複製到與LoanApplication.java相同的作業目錄即可。

您不必爲extends現有的類使用它。更好的方法通常是組合而不是繼承(請參閱:有效的Java第二版:項目16:贊成組合繼承)。例如,Person.java可能使用String firstName等。這意味着class Person使用String(等等)組成,但它不從String(無論如何,它是final class)繼承。


如何在JVM知道它可以使用Person.class即使我LoanApplication.class沒有延伸Person.class

這與繼承無關。即使class LoanApplication extends Person(這是一個HORRIBLE想法,順便說一句)時,JVM仍然需要能夠找到Person.class加載LoanApplication.class(JVM如何找到.class文件,這是另一個問題完全!)

老實說,儘管如此,我認爲在這一點上擔心這樣的細節並不會有幫助。如果您認真對待編程,我建議您使用IDE,例如Eclipse;它會爲您處理文件管理,鏈接,編譯等,因此您可以專注於實際任務,即編程

1

不,你不需要重新實現Person。只需將編譯後的「* .class」文件添加到您的類路徑中,並添加相應的導入語句以便使用Person類的實例。事實上,這就是面向對象編程的好處之一。舊對象可以在新項目中重用(假設它們設計良好,「做一件事,做一件好事」,並且沒有與特定於應用程序的邏輯結合)。

我不知道你的意思是「每個LoanApplicaiton實例如何知道它要與哪個Person屬性配合」,但假設你的getters/setters是公共的,那麼你可以從你的LoanApplication類中調用這些函數。例如,如果Person有一個名爲「setName()」的函數,那麼您的貸款申請中有一個名爲「p」的人員實例,名稱爲「n」,則可以調用「p.setName(n)」來設置對...的名字

Java虛擬機(Java Virtual Machine,JVM)有一個叫做「classpath」的概念,它決定了它尋找包含各種類的定義的「* .jar」和「* .class」文件的位置。這些類以JVM能夠讀取和獲取其定義的格式保存。至於不擴展它......對象可以用面向對象編程語言進行交互的方式有幾種不同的方式;繼承(一個對象擴展另一個),多態(多個不同的類爲同一接口提供不同的實現......這是一個特定的繼承應用),組合(一個類由其他類的實例組成),委託(一個類委託它的工作涉及一個或多個其他類的實例,這是一個特殊的合成例),以及許多其他OOP設計模式。在這種情況下,你需要組合。