Java使用静态字段

时间:2013-10-09 15:35:51

标签: java class static field instance

我正在学习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,但是您给它的值是基于实例方法参数,这是一个逻辑错误。只有税率是静态的,所有其他字段不应该是,否则无论购买什么,每次购买都是相同的。提交的分配代码表明您不理解静态字段的概念。"

我只是不明白? 他说我不了解静态领域.. 我是无知的吗?这简直令人尴尬......请说清楚。

6 个答案:

答案 0 :(得分:2)

如果所有实例都修复并共享了salesTax数量,那么最好将其定义并初始化为常量:

private static final double salesTax = 0.075;

答案 1 :(得分:2)

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

private int i;
private static int j;

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

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

答案 2 :(得分: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);     
    }

}

答案 3 :(得分:1)

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

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

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

由于你刚刚学习,我不打算在这里提供代码,但希望这会让你指出正确的方向。

答案 4 :(得分:1)

Java中的

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

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

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

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

答案 5 :(得分:1)

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