为什么在Java代码中只获取数组的最后一个对象?
我不明白为什么在执行代码后,即使moneyAmount的值大于等于150,也只显示数组drinksRange的最后一个对象water为什么在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
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
asmilk
和price
as50
当执行第4行时,name
aswater
和price
as20
因此,为了获得输出,您只需删除static
关键字,它就可以正常工作。加载类时,静态变量只在类区域中获取一次内存
static String name;
static int price;
在您的情况下,您不能将其放入代码中,它将获取数组中的最后一个值“water”
这样说,它将正常工作:)
考虑到你的主方法缺少一个}
,你甚至不知道它是如何编译的代码>静态意味着该变量属于类,而不是实例。因此,它每次都会更改为新值。
static String name;
static int price;
String name;
int price;