我希望通过我创建的菜单以及我设计的ArrayList
类中的mainList
语句向switch
PetTest
添加和删除元素。< / p>
然而,当我添加2只狗或猫(例如一只名为加菲猫而另一只名为小猫)时,我通过从我的listCats
语句中选择选项6来调用switch
方法,它显示了两只猫都有相同的名字&#34;小猫&#34;。你知道为什么我的代码会发生这种情况吗?
宠物等级:
public class Pet
{
private static String name;
public String getName()
{
return name;
}
protected void setName(String newName)
{
name = newName;
}
public Pet(String petName) {
name = petName;
}
}
狗类:
public class Dog extends Pet
{
private Double weight;
public double getWeight()
{
return weight;
}
protected void setWeight(double newWeight)
{
weight = newWeight;
}
public String toString() {
return String.format("%s , %f", getName(), getWeight());
}
public Dog(String petName, double dogWeight)
{
super(petName);
weight = dogWeight;
}
}
猫类:
public class Cat extends Pet
{
private String coatColor;
protected String getColor()
{
return coatColor;
}
protected void setColor(String newColor)
{
coatColor = newColor;
}
public String toString() {
return String.format("%s , %s", getName(), getColor());
}
public Cat(String petName, String coatColor)
{
super(petName);
this.coatColor = coatColor;
}
}
PetTest课程:
import java.util.*;
public class PetTest
{
static ArrayList<Pet> mainList = new ArrayList<Pet>();
static Iterator<Pet> mainIter = mainList.iterator();
static Scanner keyboard = new Scanner(System.in);
public static void listDogs()
{
for(Pet pet: mainList)
{
if (pet instanceof Dog)
{
System.out.println(pet.toString());
}
}//end of for loop
}//end of listDogs method
public static void listCats()
{
for(Pet pet: mainList)
{
if(pet instanceof Cat)
{
System.out.println(pet.toString());
}
}//end of for loop
}//end of listCats method
public static void addDog(String dogName,Double dogWeight)
{
Pet dog = new Dog(dogName, dogWeight);
mainList.add(dog);
}//end of addDog method
public static void addCat(String catName, String furColor)
{
Pet cat = new Cat(catName, furColor);
mainList.add(cat);
}//end of addCat method
public static void removeDog(String dogName)
{
for(Pet pet : mainList)
{
if(pet.getName().equals(dogName))
{
mainList.remove(pet);
}//end of if statement
}//end of for loop
}//end of removeDog method
public static void removeCat(String catName)
{//java.lang.IllegalStateException you must call next method of iterator
for(Pet pet : mainList)
{
if(pet.getName().equals(catName))
{
mainList.remove(pet);
}//end of if statement
}//end of for loop
}//end of removeCat method
public static void showMenu()
{
System.out.println("1. Add dog ");
System.out.println("2. Add cat");
System.out.println("3. Remove dog");
System.out.println("4. Remove cat");
System.out.println("5. List dogs");
System.out.println("6. List cats");
System.out.println("7. List all pets");
System.out.println("8. Show min, max and average weight of dogs");
System.out.println("0. Quit");
int action = keyboard.nextInt();
Scanner parameter1 = new Scanner(System.in);
Scanner parameter2 = new Scanner(System.in);
while(action != 0)
{
switch(action)
{
case 1:
System.out.println("Type in the name of the dog that you want to add.");
String dogName = parameter1.next();
System.out.println("Type in the weight of the dog that you want to add.");
Double dogWeight = parameter2.nextDouble();
addDog(dogName,dogWeight);
showMenu();
break;
case 2:
System.out.println("Type in the name of the cat that you want to add.");
String catName = parameter1.next();
System.out.println("Type in the color of the cat that you want to add.");
String furColor = parameter2.next();
addCat(catName,furColor);
showMenu();
break;
case 3:
System.out.println("Type in the name of dog that you want to remove.");
String dogToRemove = parameter1.next();
removeDog(dogToRemove);
showMenu();
break;
case 4:
System.out.println("Type in the name of dog that you want to remove.");
String catToRemove = parameter1.next();
removeDog(catToRemove);
showMenu();
break;
case 5:
listDogs();
showMenu();
break;
case 6:
listCats();
showMenu();
break;
}//end of switch statement
}//end of while loop
}//end of showMenu method
public static void main(String[] args)
{
showMenu();
}//end of main method
}//end of the class
答案 0 :(得分:1)
您的名称变量在Pet类中定义为static,这意味着它在所有Pet实例中都是相同的。删除静态修改器,你应该很好。
答案 1 :(得分:0)
所有宠物都使用相同的名称,因为name
类中的Pet
属性是静态的。
每次name = petName;
行都在Pet
构造函数上运行时,所有宠物的名称都会成为petName
的值。从attibute声明中删除static
关键字。
此外,我无法帮助注意方法removeDog
和removeCat
中无关的错误。他们将从主列表中移除任何具有给定名称的宠物,而我相信您打算removeDog
仅移除狗并removeCat
移除猫。用户可以添加名为&#34; Garfield &#34;然后成功删除 Garfield 狗。
您可以在使用 instanceof 操作符检查其名称之前,通过检查宠物是狗还是猫的实例来解决此问题。
public static void removeDog(String dogName)
{
for(Pet pet : mainList)
{
if((pet instanceof Dog) && pet.getName().equals(dogName))
{
mainList.remove(pet);
}//end of if statement
}//end of for loop
}//end of removeDog method
public static void removeCat(String catName)
{
for(Pet pet : mainList)
{
if((pet instanceof Cat) && pet.getName().equals(catName))
{
mainList.remove(pet);
}//end of if statement
}//end of for loop
}//end of removeCat method