恢复默认值的变量

variables reverting to default value

我的程序快完成了,它们是三个 classes:一个 driver class、一个披萨 class 和一个订单 class计算订单价格。我唯一的问题是,一旦我 运行 我的代码,变量将通过披萨 class 的 inputToppings 方法中的 while 循环设置,并在 toString 时打印正确的值方法是从披萨 class 中按 class 的顺序调用的,但在我的 getToppingQuantity 方法中,它传递了实例变量的默认值。我哪里错了?

package edu.ilstu;
import java.util.Scanner;

public class Pizza
   {

//default pizza is cheese and tomato sauce only

private int alfredo = 0;
private int pesto = 0;
private int tomato = 1;
private int sausage = 0;
private int pepperoni = 0;
private int onion = 0;
private int mushroom = 0;
private int greenPepper = 0;
private int cheese=1;
private char choice;

public int getCheese() {
    return cheese;
}
public int getAlfredo()
{
    return alfredo;
}
public void setAlfredo()
{
    alfredo=1;
    pesto=0;
    tomato=0;
}
public int getPesto()
{
    return pesto;
}
public void setSausage(int sausage)
{
    this.sausage = sausage;
}
public void setPepperoni(int pepperoni)
{
    this.pepperoni = pepperoni;
}
public void setOnion(int onion)
{
    this.onion = onion;
}
public void setMushroom(int mushroom)
{
    this.mushroom = mushroom;
}
public void setGreenPepper(int greenPepper)
{
    this.greenPepper = greenPepper;
}
public void setCheese(int cheese)
{
    this.cheese = cheese;
}
public void setPesto()
{
    pesto=1;
    tomato=0;
    alfredo=0;
}
public int getTomato()
{
    return tomato;
}
public void setTomato()
{
    tomato=1;
    pesto=0;
    alfredo=0;
}
public int getSausage()
{
    return sausage;
}
public int getPepperoni()
{
    return pepperoni;
}
public int getOnion()
{
    return onion;
}
public int getMushroom()
{
    return mushroom;
}

public int getGreenPepper()
{
    return greenPepper;
}
public void inputToppings() {

    Scanner sc = new Scanner (System.in);

    while (true) {

        System.out.println("Input toppings. Enter Q to quit");
        System.out.println("1. Sausage");
        System.out.println("2. Pepperoni");
        System.out.println("3. Onion");
        System.out.println("4. Mushroom ");
        System.out.println("5. Green Pepper");
        System.out.println("6. Cheese");
        System.out.println("7. Alfredo");
        System.out.println("8. Pesto");
        System.out.println("9. Tomato");

        if (choice == 'q' || choice == 'Q') {
            break;
        }
        if (choice == '1') {
            addSausage();
        }
        if (choice == '2') {
            addPepperoni();
        }
        if (choice == '3') {
            addOnion();
        }
        if (choice == '4') {
            addMushroom();
        }
        if (choice == '5') {
            addGreenPepper();
        }
        if (choice == '6') {
            addCheese();
        }
        if (choice == '7') {

            if(alfredo != 1) {
            setAlfredo();
            }
            else 
                System.out.println("No double sauce allowed");
        }
        if (choice == '8'){
            if (pesto != 1) {
                setPesto();
            }
            else
                System.out.println("No double sauce allowed");
        }
        if (choice == '9') {
            if(tomato != 1) {
                setTomato();
            }
            else
                System.out.println("No double sauce allowed");
        }

        choice = sc.next().charAt(0);
    }//end while loop
    sc.close();
}//end of inputToppings method
public void addCheese() {
    if(cheese<2) {
        setCheese(cheese+1);
    }
    else
        System.out.println("Invalid input");
}
public void addPepperoni() {
    if (pepperoni<2) {
        setPepperoni(pepperoni+1);
    }
    else 
        System.out.println("Maximum ammount of topping exceeded");
}
public void addSausage() {
    if(sausage<2) {
        setSausage(sausage+1);
    }
    else
        System.out.println("Maximum ammount of topping exceeded");
}
public void addOnion() {
    if(onion<2) {
        setOnion(onion+1);
    }
    else
        System.out.println("Maximum ammount of topping exceeded");
}
public void addGreenPepper() {
    if(greenPepper<2) {
        setGreenPepper(greenPepper+1);
    }
    else
        System.out.println("Maximum ammount of topping exceeded");
}
public void addMushroom() {
    if(mushroom<2) {
        setMushroom(mushroom+1);
    }
    else 
        System.out.println("Maximum ammount of topping exceeded");
}
public String toString() {
    String str ="sausage = " + Integer.toString(sausage)  + " Pepperoni = " + Integer.toString(pepperoni) + "\n" + "Onion = " + Integer.toString(onion) + " Mushroom = " + Integer.toString(mushroom) +"\n" + "cheese = " + Integer.toString(cheese) +"\n" + "Tomato = " + Integer.toString(tomato) + " Pesto = " + Integer.toString(pesto) + " Alfredo = " + Integer.toString(alfredo);
    return str; 
}
public int getToppingQuantity() {
    return sausage+pepperoni+onion+mushroom+cheese;
}
}//end of class

这是顺序class

public class Order
{
final double TAX_RATE = 0.075;
final double BASE_PRICE = 5.00;
final double TOPPING_CHARGE = 0.75;
final double DELIVERY_CHARGE = 0.10;
public char typeOfOrder;
public String storeLocation = "";
Pizza pizza1 = new Pizza();
Customer cust1 = new Customer();

public double calculateSubtotal() {
    double toppingPrice = (pizza1.getToppingQuantity()*TOPPING_CHARGE);
    return BASE_PRICE+toppingPrice;
}
public double calculateSalesTax() {
    return calculateSubtotal()*TAX_RATE;
}
public double calculateDeliveryCharge() {
    return (calculateSubtotal() + calculateSalesTax()) * DELIVERY_CHARGE;
}
public void displaySummary() {

    if (typeOfOrder=='d' || typeOfOrder=='D') {
        System.out.printf("Subtotal $%.2f\n", calculateSubtotal());
        System.out.printf("Sales Tax: $%.2f\n", calculateSalesTax());
        System.out.printf("Delivery Charge: $%.2f\n", calculateDeliveryCharge());
        System.out.printf("Total: $%.2f\n",  calculateSubtotal() + calculateSalesTax() + calculateDeliveryCharge());
        System.out.println(pizza1.getToppingQuantity());
        System.out.println("Thank you, come again!");
    }
    else if (typeOfOrder == 'p' || typeOfOrder == 'P') {
        System.out.println(storeLocation);
        System.out.printf("Subtotal $%.2f\n", calculateSubtotal());
        System.out.printf("Sales Tax: $%.2f\n", calculateSalesTax());
        System.out.printf("Total: $%.2f\n", calculateSubtotal() + calculateSalesTax());
        System.out.println("Thank you, come again!");
    }

}
public char getTypeOfOrder()
{
    return typeOfOrder;
}
public void setTypeOfOrder(char typeOfOrder)
{
    this.typeOfOrder = typeOfOrder;
}
public String getStoreLocation()
{
    return storeLocation;
}
public void setStoreLocation(String storeLocation)
{
    this.storeLocation = storeLocation;
}
}

最后 driver class

public class PizzaDriver
{

public static void main(String[] args) {

    Customer cust01= new Customer();
    Order order01 = new Order();
    Pizza pizza01 = new Pizza();

    Scanner sc = new Scanner(System.in);
    System.out.println("Welcome to ILSTU Pizza");
    System.out.println("Step 1: Is this for a pickup or delivery?");
    System.out.println("1 Pickup");
    System.out.println("2 Delivery");
    int choice = sc.nextInt();
    System.out.println("Choice: " + choice);

    if (choice==1) {

        order01.setTypeOfOrder('p');
        System.out.println("1. 207 W. North St, Normal, IL");
        System.out.println("2. 208 Landmark Dr, Bloomington, IL");
        System.out.println("3. 1600 W. Market St, Bloomington, IL");
        System.out.println("Which location would you like to pickup from?");
        choice=sc.next().charAt(0);

        if (choice=='1') {
            order01.setStoreLocation("207 W. North St, Normal, IL");
        }
        else if (choice=='2') {
            order01.setStoreLocation("208 Landmark Dr, Bloomington, IL");
        }
        else if (choice=='3') {
            order01.setStoreLocation("1600 W. Market St, Bloomington, IL");
        }
        else
            System.out.println("invalid choice");

        System.out.println("At this stage would you like to quit this order entry process? \n Enter 'Y' to quit or 'N' to continue on to build your pizza.");
        choice=sc.next().charAt(0);
        if (choice=='N'|| choice == 'n') {
            pizza01.inputToppings();
            System.out.println("Your pizza contains the following toppings: \n" + pizza01.toString());
            order01.displaySummary();
        }
        else if(choice == 'Y' || choice == 'y') {
            System.out.println("Thank you, come again!");
        }
    }

    else if (choice == '2') {
        //System.out.println("Step 2: Customer Information");
        order01.setTypeOfOrder('d');
        sc.nextLine();
        System.out.println("Please enter your first and last name: \n");
        cust01.setFullName(sc.nextLine());

        System.out.println("Please enter your street address");
        cust01.setAddress(sc.nextLine());

        System.out.println("Please enter your city, state and zip code");
        cust01.setCityStateZip(sc.nextLine());

        System.out.println("Please enter your phone number (10-dights only)");
        String userNumber=sc.nextLine();
        while(true) {
            if (userNumber.length()==10) {
                cust01.setPhoneNumber(userNumber);
                break;
            }
            else if (userNumber.length()!=10) {
                System.out.println("Invalid phone number, Enter a valid one");
            }
            userNumber=sc.nextLine();
        }   
        System.out.println(cust01.toString()+"\n");

        System.out.println("At this stage would you like to quit this order entry process? \n Enter 'Y' to quit or 'N' to continue on to build your pizza.");
        choice=sc.next().charAt(0);
        if (choice=='N'|| choice == 'n') {
            pizza01.inputToppings();
            System.out.println("\n Your pizza contains the following toppings: \n" + pizza01.toString());
            order01.displaySummary();
        }
        else if(choice == 'Y' || choice == 'y') {
            System.out.println("Thank you, come again!");
        }
    }
    else 
        System.out.println("invalid choice");

}
}

就像我说的,我的程序正确地完成了这些步骤,但是 returns getToppingQuantity 方法中顶部变量的错误值(注意:我没有包括客户 class 因为它不与我当前的问题无关)

您在 inputToppings() 中的 while(true) 块将永远不允许退出 while 条件(除了在 break 中您提供退出。并不是说 while(true) 是不可接受的编程实践, 但它会导致无限循环。最好提供一个布尔标志,然后在标志的值更改后退出。

在您的 Order class 中您有一个 Pizza 实例变量,但在您的 PizzaDriver 中您正在创建和使用不同的 Pizza 对象.这可能是您问题的根本原因。 (你也在用 Customer class 做同样的事情。)

这意味着

System.out.println("\n Your pizza contains the following toppings: \n"
+ pizza01.toString());

...和...

order01.displaySummary();

引用不同的 Pizza 个对象。