英文:
Why do I get only the last object of an array in my Java code?
问题
我不明白为什么在执行代码后,即使moneyAmount的值为150或更高,也只显示数组drinksRange中最后一个对象water。
public class Main {
public static void main(String[] args) {
System.out.println("咖啡机");
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("插入钱币金额: ");
int moneyAmount = new Scanner(System.in).nextInt();
for (Drink i : drinksRange) {
if (moneyAmount >= i.price) {
System.out.println("您可以购买" + 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);
}
}
}
结果如下:
咖啡机
cappuccino - 150
espresso - 80
milk - 50
water - 20
插入钱币金额: 150
您可以购买water
您可以购买water
您可以购买water
您可以购买water
英文:
I don't understand why only the last object water of array drinksRange is shown after executing the code even if the value of moneyAmount is 150 or more
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);
}
}
As a result I get this:
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
答案1
得分: 1
static String name;
static int price;
由于这些字段是 static
的,因此在调用 Drink 类的任何静态属性时,最后一个值将是所有对象的最终值,因此 ArrayList 中只包含饮料 "water" 和价格 20。
请查看下面修改后的代码:
import java.util.Scanner;
public class SOTest {
public static void main(String[] args) {
System.out.println("Coffee-machine");
Drink[] drinksRange = new Drink[4];
drinksRange[0] = new Drink("cappuccino", 150);
drinksRange[1] = new Drink("espresso", 80);
drinksRange[2] = new Drink("milk", 50);
drinksRange[3] = new Drink("water", 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);
}
}
}
}
class Drink {
String name;
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: 200
You can buy cappuccino
You can buy espresso
You can buy milk
You can buy water
英文:
Your fields
static String name;
static int price;
are static
hence the last value will be the final value for all objects when u are calling Drink.[any static property] hence the arraylist only contains the drink as water and value 20.
Check the modified code below:
import java.util.Scanner;
public class SOTest {
public static void main(String[] args) {
System.out.println("Coffee-machine");
Drink[] drinksRange = new Drink [4];
drinksRange[0] = new Drink("cappuccino", 150);
drinksRange[1] = new Drink("espresso",80);
drinksRange[2] = new Drink("milk", 50);
drinksRange[3] = new Drink("water", 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);
}
}
}
}
class Drink {
String name;
int price;
public Drink (String drinkName, int drinkPrice) {
name = drinkName;
price = drinkPrice;
System.out.println(name + " - " + price);
}
}
Output:
Coffee-machine
cappuccino - 150
espresso - 80
milk - 50
water - 20
Insert money: 200
You can buy cappuccino
You can buy espresso
You can buy milk
You can buy water
答案2
得分: 1
static int price
这会导致那个错误。
每当你使用 static
关键字时,它意味着只有一个副本。因此,会选择“最新”的值,而在你的情况下是 Drink.price = 20
。
例如:
Line 1 drinksRange[0] = new Drink(Drink.name = "cappuccino", Drink.price = 150)
Line 2 drinksRange[1] = new Drink(Drink.name = "espresso", Drink.price = 80)
Line 3 drinksRange[2] = new Drink(Drink.name = "milk", Drink.price = 50)
Line 4 drinksRange[3] = new Drink(Drink.name = "water", Drink.price = 20)
毫无疑问,这会创建一个 Drink
的实例,所以当执行第 1 行时,drinksRange[0]
在内存中有其自己的空间,但是类中的 static String name, static int price
成员在堆内有独立的内存。
因此,当执行第 1 行时,name
为 cappuccino
,price
为 150
。
当执行第 2 行时,name
为 espresso
,price
为 80
。
当执行第 3 行时,name
为 milk
,price
为 50
。
当执行第 4 行时,name
为 water
,price
为 20
。
因此,为了得到你想要的输出,只需删除那个 static
关键字,它就会正常工作。
英文:
static int price
this is causing that bug<br>
whenever you write a static
keyword it means there's only one copy of it. So the lastest
value is picked which in your case is Drink.price = 20
eg.
Line 1 drinksRange[0] = new Drink(Drink.name = "cappuccino", Drink.price = 150)
Line 2 drinksRange[1] = new Drink(Drink.name = "espresso", Drink.price = 80)
Line 3 drinksRange[2] = new Drink(Drink.name = "milk", Drink.price = 50)
Line 4 drinksRange[3] = new Drink(Drink.name = "water", Drink.price = 20)
No doubt this makes an instance of Drink
, So line 1 when executed drinksRange[0]
has its own space in memory but the members
in the class static String name,
have independent memory in
static int priceheap
<br>
so when line 1 is executed name
as cappuccino
and price
as 150
<br>
when line 2 is executed name
as espresso
and price
as 80
<br>
when Line 3 is executed name
as milk
and price
as 50
<br>
when line 4 is executed name
as water
and price
as 20
<br>
So in order to have the output, you wanted just remove that static
keyword and it will work fine.
答案3
得分: 1
静态变量在类加载时只在类区域中分配一次内存。
static String name;
static int price;
在你的情况下,你不能把它放在你的代码中,它会取数组中的最后一个值“water”。
按照下面的方式放置,它就会正确工作:
String name;
int price;
英文:
The static variable gets memory only once in the class area at the time of class loading.
static String name;
static int price;
In your case you can't put it in your code it will take the last value "water" you have on your array
Put it like this then it will work correctly
String name;
int price;
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论