为什么在Java代码中只获取数组的最后一个对象?

为什么在Java代码中只获取数组的最后一个对象?,java,Java,我不明白为什么在执行代码后,即使moneyAmount的值大于等于150,也只显示数组drinksRange的最后一个对象water public class Main { public static void main(String[] args) { System.out.println("Coffee-machine"); Drink[] drinksRange = new Drink [4]; drinksRange[0] = new

我不明白为什么在执行代码后,即使moneyAmount的值大于等于150,也只显示数组drinksRange的最后一个对象water

 public class Main {
 public static void main(String[] args) {
    System.out.println("Coffee-machine");

    Drink[] drinksRange = new Drink [4];

    drinksRange[0] = new Drink(Drink.name = "cappuccino", Drink.price = 150);
    drinksRange[1] = new Drink(Drink.name = "espresso", Drink.price = 80);
    drinksRange[2] = new Drink(Drink.name = "milk", Drink.price = 50);
    drinksRange[3] = new Drink(Drink.name = "water", Drink.price = 20);

    System.out.print("Insert money: ");
    int moneyAmount = new Scanner(System.in).nextInt();

        for (Drink i : drinksRange) {
            if (moneyAmount >= i.price) {
                System.out.println("You can buy " + i.name);
            }
        }
}

public class Drink {
  static String name;
  static int price;

 public Drink (String drinkName, int drinkPrice) {
  name = drinkName;
  price = drinkPrice;
  System.out.println(name + " - " + price);
 }
}
因此,我得出以下结论:

Coffee-machine
cappuccino - 150
espresso - 80
milk - 50
water - 20
Insert money: 150
You can buy water
You can buy water
You can buy water
You can buy water
你的领域

静态字符串名;
静态整数价格;
是静态的,因此在调用饮料时,最后一个值将是所有对象的最终值。[任何静态属性]因此arraylist仅包含作为水的饮料和值20

检查下面修改的代码:

import java.util.Scanner;
公共类SOTest{
公共静态void main(字符串[]args){
系统输出打印(“咖啡机”);
饮料[]饮料范围=新饮料[4];
drinksRange[0]=新饮料(“卡布奇诺”,150);
drinksRange[1]=新饮料(“浓缩咖啡”,80);
drinksRange[2]=新饮料(“牛奶”,50);
drinksRange[3]=新饮料(“水”,20);
系统输出打印(“插入货币:”);
int moneyAmount=新扫描仪(System.in).nextInt();
用于(饮料i:drinksRange){
如果(金额>=i.价格){
System.out.println(“您可以购买”+i.name);
}
}
}
}
class饮料{
字符串名;
国际价格;
公共饮料(串饮名、int饮价){
name=drinkName;
价格=饮用水价格;
系统输出打印项次(名称+“-”+价格);
}
}
输出:

咖啡机
卡布奇诺-150
浓缩咖啡-80
牛奶-50
水-20
插入货币:200
你可以买卡布奇诺
你可以买浓缩咖啡
你可以买牛奶
你可以买水

静态整数价格
这是导致该错误的原因
每当你写一个
static
关键字时,它意味着只有一个副本。因此,将选择
最新的
值,在您的情况下为
Drink.price=20
例如

毫无疑问,这是一个
Drink
的实例,因此执行
drinksRange[0]
时,第1行在内存中有自己的空间,但是类
静态字符串名称、静态int price
中的
成员在
堆中有独立的内存
因此,当执行第1行时,
name
作为
cappuccino
price
作为
150

当执行第2行时,
name
作为
espresso
price
作为
80

当执行第3行时,
name
as
milk
price
as
50

当执行第4行时,
name
as
water
price
as
20


因此,为了获得输出,您只需删除
static
关键字,它就可以正常工作。

加载类时,静态变量只在类区域中获取一次内存

static String name;
static int price;
在您的情况下,您不能将其放入代码中,它将获取数组中的最后一个值“water”

这样说,它将正常工作:)


考虑到你的主方法缺少一个
}
,你甚至不知道它是如何编译的静态意味着该变量属于类,而不是实例。因此,它每次都会更改为新值。
static String name;
static int price;
String name;
int price;