Java使用静态字段

我正在上java课,我不得不做一个如下的作业:

创建一个名为Purchase的类。 每次购买都包含发票编号,销售金额和销售税金额。 包括发票编号和销售金额的设置方法。 在销售金额的set()方法中,将销售税计算为销售金额的7.5%(使用购买类中的静态文件)。 还包括一种显示方法,可在格式良好的输出显示中显示购买的详细信息。 将文件另存为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 – 将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); } } 

如果salesTax数量是固定的并由所有实例共享,那么最好将其定义并初始化为常量:

 private static final double salesTax = 0.075; 

你应该做的是使salesTax字段保持静态,因为它对所有的purhase都是相同的。

所以,

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

您将值分配给salesTax的方式是错误的。 它应该是这样的

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

并在方法setSalesAmount中将其设置为

 salesTaxAmt = salesAmt * salesTax; 

由于static变量对于类的所有对象是通用的,因此应该从静态上下文而不是实例上下文(特定于类的每个实例的代码)设置static变量。 那是

 private int i; private static int j; 

这里i是一个实例变量,因为它可能会与类的不同实例具有不同的值,而j是一个staic字段,它的值对于类的所有实例是通用的。 这就是访问j实例,它的值对于所有实例都是相同的。

如果从特定实例更改静态字段的值,那么它也会反映在该类的所有其他实例中。

静态字段由类的所有实例共享。 通过使销售金额和发票编号保持不变,您实际上创建了一种只有一次购买的情况(因为它们都具有相同的发票编号和销售金额)。

您的老师试图让您展示的是正确使用共享(或静态)字段 – 销售税。 在这种情况下,所有购买都会共享该属性。

只有销售税率应该是静态的。 在main方法中,在循环中,您应该创建new购买实例。

既然你刚刚学习,我不会在这里提供代码,但希望这会让你指向正确的方向。

Java中的static成员是集体应用于整个类的static成员,而不是类的任何特定实例,因此您应该创建static的唯一字段是通用的; 销售税率是一个合适的选择,正如你的教授所说,你不应该在你的代码中间埋葬像0.075这样的“幻数”。 代替:

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

当前设置的所有字段(发票编号和金额)不适用于每次购买,仅适用于特定的购买,因此它们应该是实例变量(不是static )。

(最后,由于舍入错误,您不希望在实际代码中使用浮点数,但它对于作业分配很好。)

无论有多少销售对象或交易,静态变量在内存中只有一次。 最终意味着税率至少在他们改变法律之前是固定的那么你必须寻找一个名为taxrate的变量并将其改为8%的新值。 哦,很抱歉,你没有一个taxrate变量来定义常量,所以你必须查看7.5行的数千行代码并将其更改为8.0,希望你没有从当前的7.5佣金中给出销售部门佣金8.另一个问题,你可以有多张发票吗? 两次销售可以同时发生吗? 我的观点是,taxrate应该是唯一的静态变量,因为它是固定的。 虽然干得好,但试着看看大局。