作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
所以我有一个界面 Pet
如下所示:
public interface Pet{
void Eat();
}
实现者:
public class Puppies implements Pet {
@Override
public void Eat() {
// Something gets eaten here, presumably
}
}
和
public class Kittens implements Pet {
@Override
public void Eat() {
// Everybody knows Kittens eats something different
}
}
希望我接下来要做的是创建新宠物的 ArrayList
:
public class PetList{
public PetList(){
ArrayList pets = new ArrayList<Pet>();
Puppies spot = new Puppies();
Puppies rex = new Puppies();
Kittens meowth = new Kittens();
pets.add(spot);
pets.add(rex);
pets.add(meowth);
}
public static void main(String[] args){
// No idea how to handle this bit
}
我接下来要做的是告诉我所有的宠物吃东西。我该怎么做?
最佳答案
您当前代码的主要问题是 ArrayList
( pets
) 局部于 PetList
构造函数,这意味着您无法在类 PetList
的构造函数之外访问。
因此,首先,将 ArrayList
作为 PetList
类的实例变量,这样即使在构造函数之外也可以通过对象访问。
然后,您可以提供一个 eatAll()
方法来迭代 ArrayList<Pet>
并在所有 eat()
对象上调用 pet
方法。
您可以引用下面的代码并遵循内联注释:
public class PetList{
private List<Pet> pets;//now this is an instance variable
public PetList(){
this.pets = new ArrayList<Pet>();//this list is not local now
Puppies spot = new Puppies();
Puppies rex = new Puppies();
Kittens meowth = new Kittens();
pets.add(spot);
pets.add(rex);
pets.add(meowth);
}
public void eatAll() { //method to invoke eat() on list of pets
for(Pet pet : this.pets) { //iterate the pets list
pet.eat();//call eat() on each pet object
}
}
public static void main(String[] args){
PetList petList = new PetList();
petList.eatAll();//invoke the eatAll() method
}
}
作为旁注,我强烈建议您遵循 Java 命名标准(Eat()
应为 eat()
,即方法名称应以小写字母开头)并考虑将 PetList
类重命名为 PetsTesting
(或其他),以便开发人员更直观。
最后但重要的一点是,不要将对象直接分配给具体类类型,例如 ArrayList<Pet> pets = new ArrayList<>();
或 Puppies spot = new Puppies();
。
最佳实践是您需要将对象分配给接口(interface)类型 List<Pet> pets = new ArrayList<Pet>();
或 Pet spot = new Puppies();
(称为接口(interface)类型的代码)
关于java - 如何为 ArrayList 中的所有对象调用一个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43301404/
我是一名优秀的程序员,十分优秀!