2013-10-09 46 views
0

我正在學習java類,我不得不做一個任務如下:Java對靜態字段的使用

創建一個名爲Purchase的類。每筆採購都包含發票號碼,銷售金額和銷售稅金額。 包含發票號碼和銷售金額的設置方法。 在銷售金額的set()方法中, 計算出售金額的銷售稅爲7.5%(使用Purchase類中的靜態字段)。 還包括一種顯示方法,可在格式良好的輸出顯示中顯示購買細節。 將文件另存爲Purchase.java。編譯並運行你的程序,直到它工作,輸出看起來不錯。在課程文檔中描述 添加必要的文件,然後你的.java文件附加到這個分配

我的解決辦法如下:

import java.util.*; 

public class Purchase { 
    //Properties of Purchase class - static 
    private static int invoiceNumber; 
    private static double salesAmount; 
    private static double salesTax; 

    //setter for invoiceNumber 
    public static void setInvoiceNum(int invNo){ 
     invoiceNumber = invNo; 
    } 

    //setter for salesAmount 
    public static void setSalesAmount(double salesAmnt){ 
     salesAmount = salesAmnt; 
     salesTax = 0.075*salesAmnt; 
    } 

    //public static method to display purchase info 
    public static void displaySalesInfo(){ 
     System.out.println("Invoice Number: " + Purchase.invoiceNumber); 
     System.out.println("Sales Amount: " + Purchase.salesAmount); 
     System.out.println("Sales Tax: " + Purchase.salesTax); 
    } 

    //main method that makes use of the static properties and display method  
    public static void main (String[] args) { 
     //ask user to input purchase details 
     Scanner scan = new Scanner(System.in); 
     System.out.println("Enter your invoice Number:"); 
     int inv = scan.nextInt(); 

     System.out.println("Enter your Sales Amount:"); 
     double sales = scan.nextDouble(); 

     // send the user submitted purchase details to the setter methods and call display method 
     setInvoiceNum(inv); 
     setSalesAmount(sales); 
     displaySalesInfo();  
    } 

} 

這裏是我的老師的評語: 「對於這項任務你需要使用Purchase類中的靜態字段來提供7.5%的銷售稅,在你提交的代碼中,你使用了一個數字字面值,大多數人會認爲這是一個非常糟糕的編程習慣,你設置了靜態變量salesTax,但是你給它的價值是基於實例方法參數,這是一個邏輯錯誤。只有稅率是靜態的,所有其他領域不應該是不管購買什麼,每次購買都是一樣的。 「

我只是不明白?? 他說我不瞭解靜態字段.. 我是那麼無知?這簡直是尷尬。 。請闡明一些

+1

'基於實例方法參數'好吧,你的老師也是錯的......這裏沒有實例方法,只有靜態方法...但是,你應該粘貼代碼來設置它 – ppeterka

+0

那麼你的老師檢查你使用Purshase作爲有意義的對象實例。發票號碼和銷售額在上下文中不應該是靜態的。您需要對象實例來創建多個purshase對象,並調用purshaseObj.displaySalesInfo()將顯示該特定對象的信息。 請參閱:http://stackoverflow.com/questions/2671496/java-when-to-use-static-methods – Francis

回答

2

靜態字段始終類變量,這意味着這個類的每個實例在這個類的靜態字段上共享相同的引用。

在你的例子中,它並不重要,但在現實世界中,你的代碼將毫無用處。我想你應該做的是:

1 - 定義salesTaxRate像Juned靜態字段中寫道

2 - 定義等領域不是一成不變的

3 - 在你的主,那就得更好地看到某處購買myPur = new Purchase();

換句話說(對不起,一個可能的錯誤,我寫的代碼,直接在這裏^^):

import java.util.*; 

public class Purchase { 
    //Properties of Purchase class - static 
    private static double taxRate = 0.075; // Shared by all instances 

    // Members that are instance-visible 
    private int invoiceNumber; 
    private double salesAmount; 
    private double salesTax; 

    //setter for invoiceNumber, not static as it works on a non-static field 
    public void setInvoiceNum(int invNo){ 
     invoiceNumber = invNo; 
    } 

    //setter for salesAmount, not static as it works on non-static fields 
    public void setSalesAmount(double salesAmnt){ 
     salesAmount = salesAmnt; 
     salesTax = Purchase.taxRate*salesAmnt; // Note the Purchase.taxRate notation 
    } 

    //public static method to display purchase info 
    // I keep it static just as an example : here you HAVE to give the purchase to 
    // display BECAUSE the method is static 
    public static void displaySalesInfo(Purchase pur){ 
     System.out.println("Invoice Number: " + pur.invoiceNumber); 
     System.out.println("Sales Amount: " + pur.salesAmount); 
     System.out.println("Sales Tax: " + pur.salesTax); 
    } 

    //main method that makes use of the static properties and display method  
    public static void main (String[] args) { 
     //ask user to input purchase details 
     Scanner scan = new Scanner(System.in); 
     System.out.println("Enter your invoice Number:"); 
     int inv = scan.nextInt(); 

     System.out.println("Enter your Sales Amount:"); 
     double sales = scan.nextDouble(); 

     // send the user submitted purchase details to the setter methods and call display method 
     Purchase myPurchase = new Purchase(); 
     myPurchase.setInvoiceNum(inv); 
     myPurchase.setSalesAmount(sales); 
     displaySalesInfo(myPurchase);  
    } 

} 
2

如果銷售稅量由所有實例固定和共享那麼最好是定義和初始化它作爲一個常數:

private static final double salesTax = 0.075; 
+2

這是如何回答這個問題? – ppeterka

+1

@ ppeterka66:我明白了爲什麼你很困惑,但是你的問題是你在運行期間根據輸入設置稅率,這是一個壞主意。將其設置爲一個常數值會更好。這就是答案告訴你的。 – Izmaki

+0

@Izmaki我沒有設置任何東西...另外,你不能意識到我的問題。而且,我一點都不困惑。只是這不能回答**爲什麼**可憐的傢伙代碼是對面向對象編程的徹底誤解......這個答案似乎是在嘗試'FGITW'策略給我。 – ppeterka

1

靜態字段由的所有實例共享通過將銷售金額和發票號碼設置爲靜態,您就可以了基本上造成了只有一次購買的情況(因爲它們都具有相同的發票號碼和銷售額)。

您的老師試圖讓您演示的是正確使用共享(或靜態)字段 - 銷售稅。在這種情況下,該屬性真的被所有購買共享。

只有銷售稅率應該是靜態的。在您的main方法中,在您的循環中,您應該創建new購買實例。

既然你只是在學習,我不會在這裏提供代碼,但希望這會讓你指出正確的方向。

2

你應該做的是讓salesTax字段爲靜態,因爲它對於所有的相位都是相同的。

所以,

private static final double SALES_TAX= 0.075; 
\\it is convention that final fields are given capitalized identifiers 

您指定的值,以銷售稅的方式是錯誤的。它應該是這樣

private double salesTaxAmt; 
\\ a variable to hold the sales tax amount specific to the purchase 

,並將其設置在該方法中setSalesAmount作爲

salesTaxAmt = salesAmt * salesTax; 

由於static變量是常見的一類中的所有對象,應該從 靜態上下文來設置,而從一個實例上下文(特定於該類的每個實例的代碼)。也就是說

private int i; 
private static int j; 

這裏i是一個實例變量,因爲它可以並且必須與類的不同 情況下,不同的價值,而j是staic領域,它的值是常見的類的所有實例。無論哪個實例訪問j,其值對於所有實例都是相同的。

如果您從特定實例更改靜態字段的值,那麼它也會反映在該類的所有其他實例中。

1

static Java中的成員是集體應用於整個類的成員,而不是類的任何特定實例,所以您應該創建的唯一字段是具有通用性的字段;銷售稅費率將是一個合適的選擇,正如您的教授所指出的,您不應該在代碼中間埋入像0.075這樣的「幻數」。相反:

static double salesTaxRate = 0.075; 
// maybe static getter and setter 

所有你目前已設置static(發票號碼和金額)並不適用於每一個購買,只是於特定的領域,所以他們應該是實例變量(不static) 。

(最後,你不希望使用浮點的錢,因爲舍入誤差的真實世界的代碼,但它很好的家庭作業。)

+0

+1爲浮點警告... – ppeterka

1

靜態變量在內存不管有多少銷售對象或交易一次。最終意味着稅率固定至少在他們改變法律之前,那麼您必須查找一個名爲「稅率」的變量並將其更改爲8%的新值。哦,我很抱歉,您沒有稅率變量來定義常量,因此您需要查看數以千計的7.5行代碼並將其更改爲8.0,希望您沒有將銷售部門佣金從當前7.5的佣金到8。另一個問題可以有多個發票?兩個銷售能同時發生嗎?我的觀點是稅收應該是唯一的靜態變量,因爲它是固定的。雖然幹得好,但試圖看到大局。