从类中调用计算的变量

问题描述:

我在练习中遇到了一些问题,我想知道是否有人可以提供帮助。这里是问题:从类中调用计算的变量

创建一个名为Purchase的类。每笔采购都包含发票号码,销售金额和销售税金额。包括发票号码和销售金额的设置方法。在销售金额的set()方法中,将销售税计算为销售额的5%。还包括显示购买细节的显示方法。保存为Purchase.class b。创建一个声明一个Purchase对象并提示用户购买细节的应用程序。当您提示输入发票号码时,请勿让用户继续操作,直至输入介于1,000和8,000之间的数字。当您提示销售金额时,请不要继续,直到用户输入非负值。创建有效的购买对象后,显示对象的发票编号,销售额和销售税。

这是我为我的采购类

import javax.swing.JOptionPane; 
import java.util.Scanner; 

public class Purchase 
{ 
    //variables 
    public static int invoice; 
    public static double saleAmount; 
    public static double saleTax; 

    //get&set for Invoice 
    public void setInvoice(int x) 
     { 
      invoice = x; 
     } 
    public int getInvoice() 
     { 
      return invoice; 
     } 

    //get&set for saleAmount 
    public void setSaleAmount(double y) 
     { 
      saleTax = y * 0.05; 
      saleAmount = y; 
     } 
    public double getSaleAmount() 
     { 
      return saleAmount; 
     } 

    //get for saleTax 
    public double getSaleTax() 
     { 

      return saleTax; 
     } 

    //display method 
    public void display(int invoice, double saleAmount, double saleTax) 
     { 
     System.out.println("Invoice number: " + invoice + '\n' + "Sale's Amount: " + saleAmount + '\n' + "Sale's Tax: " + saleTax); 
     } 
} 

代码为CreatePurchase类的代码

import javax.swing.JOptionPane; 
import java.util.Scanner; 

public class CreatePurchase 

{ 
    public static void main(String[] args) 

    {   
     Purchase purchase1 = new Purchase(); 

     //scanner for sales amount  
     Scanner inputDevice = new Scanner(System.in); 
     System.out.println("Please enter the sale amount: "); 
     Purchase.saleAmount = inputDevice.nextDouble(); 

     //loop for saleAmount 
       while (Purchase.saleAmount < 1) 
        { 
        System.out.print('\n'+ "Error, your sale amount needs to be more than 0. Please enter a valid sale amount: >> "); 
        Purchase.saleAmount = inputDevice.nextDouble(); 
        } 

     //scanner for invoice 
     System.out.println("Please enter an invoice number between 1000 and 8000: "); 
     Purchase.invoice = inputDevice.nextInt(); 

       //loop for invoice 
       while (Purchase.invoice < 999 || Purchase.invoice > 8000) 
        { 
        System.out.print('\n'+ "Error, please enter a valid invoice number between 1000 and 8000: >> "); 
        Purchase.invoice = inputDevice.nextInt(); 
        } 

     //display result 
     JOptionPane.showMessageDialog(null, "Your invoice number is " + Purchase.invoice + '\n' 
     + "Your sale tax is: " + Purchase.saleTax + '\n' 
     + "Your grand total is: " + Purchase.saleAmount);    

    } 
} 

正如你可以看到,当您运行的第二类中,saleAmount不包括额外5%的销售税和销售税仍然为0.可能是一件非常愚蠢的事情,但我不知道从哪里开始。

+1

如果您打算为类属性设置getter和setter,那么您应该使属性为'private',以便在setter中进行任何计算必须进行计算,因为您无法直接在类之外设置属性 –

saleTax通过setSaleAmount方法计算。你永远不会调用这个方法,所以saleTax从不计算。

相反的:

   Purchase.saleAmount = inputDevice.nextDouble(); 

你可能想:

   purchase1.setSaleAmount(inputDevice.nextDouble()); 

您可能还需要通过一些文字解释,和之间的静态和实例成员类和对象之间的区别阅读。但通过改变这一行代码,程序至少可以工作。

+0

现在没有编制,错误调用: 符号:变量getSaleTax 位置:型购房的变量purchase1 CreatePurchase.java:46:错误:无法找到符号 \t \t + “你的总计是:” + purchase1.getSaleAmount); –

+0

您需要像使用getSaleTax()而不是getSaleTax一样使用它。您试图将该函数用作错误的变量。 –

+0

您正在将一种方法看作是一种属性。要调用一个方法,你必须使用括号'()' – Joni

发票的定义,saleAmount和saleTax为public static打败了面向对象程序设计的目的。

它们应该是私有实例变量,您应该通过调用您创建的实例上的get和set方法来访问和修改它们(purchase1)。否则,定义这些setter和getters是没有意义的,创建这个实例是没有意义的,你永远不会使用它。

+0

谢谢伊兰,我试图使用这个实例,但我很漂亮,并且不是100%如何。现在好,非常感谢你! :d –

1)将您静态类变量为实例变量。

private int invoice; 
private double saleAmount; 
private double saleTax; 

2)然后使用您的Purchase对象的getter/setter

purchase1.setSaleAmount(); 
purchase1.getSaleAmount(); 

注:静态字段不识别对象实例。如果想要有多个Purchase对象,您的变量应该是实例变量而不是类(静态)变量。