【问题标题】:calling methods, parameters and arguments调用方法、参数和参数
【发布时间】:2020-06-06 11:07:51
【问题描述】:

这可能是一个愚蠢的问题。我的以下代码看起来不错,但在输出上,它并不期望我的测试场景有结果。代码如下:

 import java.util.Scanner;
  public class PartyPlannerLab {
                      public static Scanner input = new Scanner(System.in);

    public static int getGuestCount(int guests) {
        while(true) {
            System.out.print("Enter number of guests: ");
            guests = input.nextInt();
            if (guests >= 1 && guests <= 100)
                break;
            else 
                System.out.println("The guest count must be at least 1, but does not exceed 100. Please enter again.");
        }
        return guests;
    }
    public static int getSlicesPerPerson(int slicesPerPerson) {
        while(true) {
        System.out.print("Enter number of slices per person: ");
        slicesPerPerson = input.nextInt();
        if (slicesPerPerson >= 1 && slicesPerPerson <= 8)
            break;
        else
            System.out.println("The pizza slice count must be at least 1, but does not exceed 8. Please try again.");
        }
        return slicesPerPerson;
    }
    public static double computeRoomCost(int guests, double roomCost) {
        if (guests <= 30)
            roomCost = 100.00;
        else
            roomCost = 200.00;
        return roomCost;
    }
    public static double computeSodaCost(double sodaCost, int guests) {
        sodaCost = guests * 1.50;
        return sodaCost;

    }
    public static void printSummary(int guests, double roomCost, double sodaCost, double pizzaCost) {
        System.out.println("Total Guests: " + guests);
        System.out.println("RoomCost: $" + roomCost);
        System.out.println("SodaCost: $" + sodaCost);
        System.out.println("PizzaCost: $" + pizzaCost);
        System.out.println("Total Cost: $" +(roomCost + sodaCost + pizzaCost));
    }
    public static void main(String[] args) {
        int guests = 0;
        int slicesPerPerson = 0;
        double roomCost = 0.0;
        double sodaCost = 0.0;
        double pizzaCost = 0.0;
        getGuestCount(guests);
        getSlicesPerPerson(slicesPerPerson);
        computeRoomCost(guests, roomCost);
        computeSodaCost(sodaCost, guests);
        printSummary(guests, roomCost, sodaCost, pizzaCost);

        input.close();
    }


    }

一个输出如下:

Enter number of guests: 10
Enter number of slices per person: 2
Total Guests: 0
RoomCost: $0.0
SodaCost: $0.0
PizzaCost: $0.0
Total Cost: $0.0

【问题讨论】:

  • 您的期望是什么?
  • getGuestCount(guests); 是一个返回客人数量的方法调用。您没有将此值分配给任何东西。 guests = getGuestCount();(不需要传递参数,因为你不能像在 java 中那样重新分配参数)是你所追求的。与所有其他变量相同。

标签: java methods parameters arguments call


【解决方案1】:

您没有使用getGuestCountgetSlicesPerPerson 等的返回值。

那些方法返回一个值,这基本上意味着您可以像使用它们一样使用它们。 input.nextInt 也返回一个值,这就是为什么你可以把它放在= 的右边。

在方法内部,getGuestCount似乎改变了传入的guests的值,但是这种改变实际上并不会反映在调用方,因为Java是按值传递的.你有点扔掉传入的值。

事实上,只有当参数通过引用传递时,您的方法才会按原样工作,以便方法可以修改传入的变量。但这在Java 中是不可能的。请参阅 this post 了解 pass-by-value 和 pass-by-reference 之间的区别。

在 Java 中重写方法的正确方法是返回值(他们已经在这样做,但您没有使用返回值),并删除无关参数。

public static int getGuestCount() {
    int guests;
    while(true) {
        System.out.print("Enter number of guests: ");
        guests = input.nextInt();
        if (guests >= 1 && guests <= 100)
            break;
        else 
            System.out.println("The guest count must be at least 1, but does not exceed 100. Please enter again.");
    }
    return guests;
}
public static int getSlicesPerPerson() {
    int slicesPerPerson;
    while(true) {
    System.out.print("Enter number of slices per person: ");
    slicesPerPerson = input.nextInt();
    if (slicesPerPerson >= 1 && slicesPerPerson <= 8)
        break;
    else
        System.out.println("The pizza slice count must be at least 1, but does not exceed 8. Please try again.");
    }
    return slicesPerPerson;
}
public static double computeRoomCost(int guests) {
    double roomCost;
    if (guests <= 30)
        roomCost = 100.00;
    else
        roomCost = 200.00;
    return roomCost;
}
public static double computeSodaCost(int guests) {
    double sodaCost = guests * 1.50;
    return sodaCost;
}

这就是“使用返回值”的方式:不要传入您希望方法修改的变量,而是将其放在赋值语句中= 的左侧:

    guests = getGuestCount();
    slicesPerPerson = getSlicesPerPerson();
    roomCost = computeRoomCost(guests);
    sodaCost = computeSodaCost(guests);

【讨论】:

    【解决方案2】:

    你没有得到输出的原因是你在你的 main 方法中初始化的值没有被你正在进行的方法调用更新。

    以下代码可能会解决您面临的问题 -

     public static void main(String[] args) {
        int guests = 0;
        int slicesPerPerson = 0;
        double roomCost = 0.0;
        double sodaCost = 0.0;
        double pizzaCost = 0.0;
        guests = getGuestCount(guests);
        slicesPerPerson = getSlicesPerPerson(slicesPerPerson);
        roomCost = computeRoomCost(guests, roomCost);
        sodaCost = computeSodaCost(sodaCost, guests);
        printSummary(guests, roomCost, sodaCost, pizzaCost);
    
        input.close();
    }
    

    注意- 方法getGuestCount & getSlicesPerPerson 中不需要传入参数作为输入正在从 I/O 中获取

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 2016-07-11
      相关资源
      最近更新 更多