【问题标题】:Java use of static fieldsJava 使用静态字段
【发布时间】:2013-10-09 15:35:51
【问题描述】:

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

}

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

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

【问题讨论】:

  • based on the instance method parameter 嗯,你的老师也错了……这里没有实例方法,只有静态方法……但是,你应该粘贴设置它的代码
  • 你的老师检查你是否使用 Purshase 作为一个有意义的对象实例。在您的上下文中,发票编号和销售额不应是静态的。您需要对象实例来创建多个 purshase 对象,调用 purshaseObj.displaySalesInfo() 将显示该特定对象的信息。见:stackoverflow.com/questions/2671496/…

标签: java class static field instance


【解决方案1】:

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

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

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);     
    }

}

【讨论】:

    【解决方案2】:

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

    private static final double salesTax = 0.075;
    

    【讨论】:

    • 这如何回答这个问题?
    • @ppeterka66:我明白您为什么感到困惑,但您的问题是您在运行时根据输入设置税率,这是一个坏主意。将其设置为恒定值会更好。这就是答案告诉你的。
    • @Izmaki 我没有设置任何东西......另外,你无法意识到我的问题。而且,我一点也不困惑。只是这并没有回答 为什么 可怜的家伙代码是对面向对象编程的完全误解......这个答案似乎只是对我的FGITW 策略的尝试。
    • @ppeterka66:我误认为是问这个问题的人——我的错。这个答案,GFITW 与否,回答了他一半的问题。如果他将final 添加到变量中,他将根本无法在方法中设置它。另一半他没有回答,不,但是问这如何回答the问题是错误的。编辑:神圣的 po*p,我一定把我的英语能力留在了某个地方。我很抱歉。
    【解决方案3】:

    您应该做的是使 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,它的值对于所有实例都是相同的。

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        【解决方案5】:

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

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

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2011-06-01
            • 2023-03-03
            • 2020-11-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多