0

我正在上 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();     
    }

}

这是我老师的评论:“对于这个作业,你要使用采购类中的静态字段提供 7.5% 的销售税。在你提交的代码中,你使用了数字文字,大多数人会认为这是一种非常糟糕的编程习惯.你确实设置了静态变量salesTax,但是你给它的值是基于实例方法参数的,这是一个逻辑错误。只有税率是静态的,其他字段都不应该是静态的,否则每次购买都是不管买什么都一样。提交的分配代码表明你不了解静态字段的概念。

我就是不明白??他说我不了解静态场..我有那么无知吗?这简直令人尴尬。请说明一下。

4

6 回答 6

2

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

private static final double salesTax = 0.075;
于 2013-10-09T15:38:19.173 回答
2

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

所以,

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变量对类的所有对象都是通用的,因此它应该从静态上下文而不是实例上下文(特定于类的每个实例的代码)中设置。那是

private int i;
private static int j;

i是一个实例变量,因为它可能并且对于类的不同实例具有不同的值,而j它是一个静态字段,它的值对类的所有实例都是通用的。那是无论什么实例访问j它的值对于所有实例都是相同的。

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

于 2013-10-09T15:46:03.557 回答
2

静态字段始终是类变量,这意味着此类的每个实例在此类的静态字段上共享相同的引用。

在您的示例中,这并不重要,但在现实世界中,您的代码将毫无用处。我认为你应该做的是:

1 - 将 salesTaxRate 定义为像 Juned 写的静态字段

2 - 定义你的其他字段不是静态的

3 - 在你的主要,最好在某处看到 Purchase 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);     
    }

}
于 2013-10-09T15:58:55.607 回答
1

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

于 2013-10-09T16:22:18.207 回答
1

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

你的老师试图让你证明的是正确使用共享(或静态)字段——销售税。在这种情况下,该属性实际上是由所有购买共享的。

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

由于您只是在学习,因此我不会在此处提供代码,但希望这会让您指向正确的方向。

于 2013-10-09T15:45:32.860 回答
1

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

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

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

(最后,由于舍入错误,您不想在实际代码中使用浮点来赚钱,但对于家庭作业来说这很好。)

于 2013-10-09T15:46:07.697 回答