2012-04-01 30 views
1

我試圖得到比迄今爲止能夠更好的理解......它是爲了幫助我上課,但沒有完成任何特定的家庭作業;我正在尋找更多的概念信息,這些信息在我的教科書或教程中找不到。在純粹的理論層面上,我明白了爲什麼封裝對面向對象編程來說是強大的,但需要更好地理解什麼,特別是正在發生。我一直在困惑自己關於數據流的路徑,並且想知道我們從哪裏獲取數據和設置數據。希望這不是「沒有愚蠢問題」規則的例外。在Java中獲取和設置方法。他們如何工作?

考慮:

public class Employee 
{ 
    private int empNum; 
    public int getEmpNum() 
    { return empNum; } 
    public void setEmpNum(int Emp) 
    { empNum = emp; } 
} 

我的這種解釋:使用int Emp從某處過去了,我們在set...方法設置的聲明empNum變量。然後,我們get...該變量並將其返回給調用方法。這是一個很好的理解?

進一步考慮:

import.javax.* 
public class CreateEmp 
{ 
    public static void main(String[] args) 
    { 
     int ssn; 
     ssn = JOptionPane.showInputDialog(null,"enter ssn"); 
     Employee newEmp = new Employee(123456789); 
     JOptionPane.showMessageDialog(null,"Employee ID " + newEmp.getEmpNum); 
    } 
} 

有了這個類,因爲在聲明new Employee(123456789)自動地發送該值到set...方法我並不需要顯式set一個變量。 Employee方法中的return將結果值返回給調用方法,並使該變量可用,在本例中爲我的對話框輸出。我有處理嗎?

這裏是我困惑的地方。根據我上面提到的理解 - 這可能是關閉的 - 我永遠不能決定放置邏輯的最佳位置。例如:我會在Employee類中放置「輸入員工編號」對話框,只有傳遞給方法的參數爲null時纔會運行條件。在我看來,就我所瞭解的數據流而言,課程的目的是獲得一個員工編號。如果沒有提供默認值,則需要創建一個。我不確定這個想法是否是最佳實踐,或者如果我以後爲自己設置了麻煩。

我很想聽聽關於我是否正確理解發生了什麼的一些想法。

+2

UI不應該在Employee類中,因爲員工不在乎它如何獲取信息,也不應該這樣做。 Java中幾乎沒有什麼是「自動的」:構造函數參數值被設置爲實例值的唯一方法是如果實例值是構造函數設置它的值:您的示例除了缺省構造函數以外什麼也沒有,因此嘗試使用a實例化具有參數的ctor將無法編譯。 – 2012-04-01 22:06:56

+0

我認爲這是我感到有點困惑的地方,可能是因爲我一直是程序編程人員,直到現在。 get-set組合與UI不同,在我看來,UI創建一個值,將其發送到get-set,然後將其返回到UI。爲什麼不跳過get-set並使用UI中的值?我知道它與抽象有關,但我們創建的簡單骰子,卡片和員工程序可能僅僅是太簡陋而無法爲我製作這種凝膠。 – dwwilson66 2012-04-02 00:09:05

回答

2

首先,這個網站是能夠具體地回答問題,使用較多;沒有太多的理論問題。

總之,第一部分'get'和'set'你很好理解。現在當你說你不需要明確設置員工編號時,因爲你確實「新員工......」並不完全正確。如果你明確定義了一個構造函數,它會爲一個參數提供一個整數,然後將'empNum'設置爲等於所說的整數值。

吸氣劑和吸入器通常與「私人」修飾劑一起使用。 Setter可以用來控制輸入。例如,您可以檢查提供的值是否大於零,如果您直接訪問,則不能。 Getters只允許檢索值,但要進行更改則需強制使用相應的setter(如果有)。

如果沒有提供某個值,您應該如何設置默認值。考慮你檢索的值(如果有的話)將被用在不同的類中。如果用戶從未設置值,該怎麼辦?如果這不是你所期望的呢?不同的階級,不管它是什麼,仍然需要一個價值,你仍然需要傳遞一些東西。通過設置默認值,不同課程可以識別出「哦,這是一個默認值 - 這意味着用戶可能沒有提供正確的輸入。」通過這樣做,您可以創建一個相對安全的應用程序;即使輸入不是預期的,你仍然可以繼續工作。

2

爲私有變量使用公共訪問器的目的是控制如何訪問這些變量並確保所有內部狀態保持一致。例如,一個類可能同時有一個age和一個birthdate變量。設置birthdate也隱式設置年齡。如果直接訪問這些變量,則可以將它們設置爲不一致的值(即,生日表示他們是30,但年齡設置爲35)。通過使用setter,我們可以確保設置出生日期將重置年齡是正確的。

在這個例子中,使用setter也可以讓我們將age變量轉換成一個生成的屬性。由於年齡可以使用birthdate直接確定,因此您可以爲age創建一個獲取者並讓它直接計算並返回年齡,而不需要將其存儲在任何地方。

如果我們使用getter和setter來公開這些對象屬性,我們可以自由地切換實現(例如,移除age變量並在運行中計算它),而不需要我們的對象的用戶擔心它。

+0

作爲一個快速跟進,您不必爲所有變量聲明getter和setter。正如@JHenderson在他的回答中提到的,如果你有一個不應該被重置的變量,那麼不要聲明一個setter,因爲你不想讓其他類改變它。 – 2012-04-01 22:09:02

2

這取決於您如何使用Employee對象。如果在施工時,您始終提供員工編號或自動提供的員工編號,並且員工編號絕不會設置在其他地方,那麼您將不需要設置方法。

但是,如果您在某些時候要將員工編號設置爲其他值(可能是發生了錯誤並且需要更新編號),那麼您需要使用「set」方法。在這種情況下,從構造函數中調用「set」方法可能最容易。

這實際上取決於如何使用/實例化Employee類。

1

你說

有了這個類,我並不需要明確設置變量,因爲宣佈新員工(123456789)自動地發送該值來設定的......方法。

我很確定這不是真的。考慮一下:Java創建一個Employee對象,構造函數接收值123456789。它如何知道需要分配該值的變量?它不知道。可能有多個屬於該對象的變量,因此它不知道123456789的真正含義。

當您沒有在Java中定義構造函數時,它會自動爲您創建一個構造函數。但是那個沒有任何參數,它只是一個默認的構造函數。你的代碼有幾個編譯錯誤(例如,javax的導入行是錯誤的),所以我猜你正在運行一個以前編譯過的代碼版本。刪除項目中的所有.class文件,修復編譯錯誤並再次運行。它應該給你一個錯誤。它還會使數據流更容易理解。構造函數應該是這個樣子:

 
public Employee(int empNum) { 
    this.empNum = empNum; 
} 

現在做很多更有意義的是getEmpNum()知道要返回的值。

1

有了這個類,我不需要顯式設置一個變量,因爲聲明新的Employee(123456789)會自動將該值發送到set ...方法。 Employee方法中的返回值將結果值返回給調用方法,並使該變量可用,在本例中爲我的對話框輸出。我有處理嗎?

你的理解在這裏有點不對。聲明

new Employee(123456789) 

通過使用構造函數方法創建新的Employee對象。構造函數通常使用參數來設置類的內部成員變量。 所以完整的Employee類是 -

public class Employee 
{ 
    private int empNum; 

    public Employee(int employeeNum) { 
    empNum = employeeNum; 
    } 
    public int getEmpNum() { 
    return empNum; 
    } 
    public void setEmpNum(int Emp) { 
    empNum = emp; 
    } 
}