2

Sorry I'm a beginner just starting out using Java and I've encountered this problem

I have two classes, say they are

class Dog {

}

class Cat {

}

then I created an array that is filled up with either one of those two

Object[][] myAnimal = new Object[4][5];

I want to set a variable equal to a random Object from my array, but I don't know which class it came from. Is there any way to do this?

4

4 回答 4

3

理想的解决方案是创建自己的超类,比如Animal声明了抽象方法。例如,您可以这样做:

abstract class Animal {
    public abstract void speak();
}

然后CatDog每个人都为抽象方法提供自己的实现:

class Cat {
    public void speak() {
        System.out.println("Meow!");
    }
}

class Dog {
    public void speak() {
        System.out.println("Woof!");
    }
}

现在您可以简单地将您的数组声明为

Animal[][] myAnimal = new Animal[4][5];

在数组中放置一些动物:

myAnimal[0][0] = new Dog();
myAnimal[0][1] = new Cat();

然后告诉动物说话:

myAnimal[0][0].speak();
myAnimal[0][1].speak();

我已经省略了main()这里的语法,但我希望你可以自己把它放在一起。这里使用的概念称为“多态性”。我强烈建议您研究它,以帮助您在设计代码时使用这个关键的 OO 概念。

于 2013-02-18T02:43:58.760 回答
1

好吧,假设您的数组充满了两个类之一的实例,您可以执行以下操作:

if(myAnimal[x][x] instanceof Dog) //it is an instance of the Dog class 

你真的不应该做这样的事情,特别是作为一个初学者。你说你想随机选择一只狗或猫?更好的方法是保留两个单独的数组,一个用于狗,一个用于猫。然后你可以从两个数组中选择一个随机元素,你就会知道你正在处理什么类。

于 2013-02-18T02:35:26.013 回答
1

在这种情况下,访问者模式将是非常好的考虑方法。比方说,您正在制作一款需要针对不同对象(猫、狗、金钱等)做出不同反应的游戏。所以这样做:

创建一个具有以下定义的接口IAnimal

interface IAnimal {
    void visit(IAnimalVisitor visitor, Object param);
}

class Cat implements IAnimal {
    void visit(IAnimalVisitor visitor, Object param) {
        visitor.visit(this, param);
    }
}

class Dog implements  IAnimal {
    void visit(IAnimalVisitor visitor, Object param) {
        visitor.visit(this, param);
    }
}

将为定义的每种动物类型IAnimalVisitor包含一个visit()方法。所以它会像:

interface IAnimalVisitor {
    public void visit(Cat c, Object param);
    public void visit(Dog c, Object param);
}

然后,您可以根据需要使用逻辑来处理猫和狗。例如:

class AnimalFeeder implements IAnimalVisitor {
    public void visit(Cat c, Object param) {
        c.feed(milk);
        c.feed(cat_food);
    }
    public void visit(Dog d, Object param) {
        d.feed(dog_food);
    }
}

然后你可以使用上面的食物喂养类来喂养你的IAnimal数组,如下所示:

IAnimal[] animals = new IAnimal[] { new Cat(), new Dog(), 
    new Dog(), new Cat() };

IAnimalVisitor feeder = new AnimalFeeder();
for(IAnimal animal : animals) {
    animal.visit(feeder, null); 
}

您可以完全自由地处理类中的任何层次结构。只需将visit()每个动物类类型的IAnimalVisitor.

于 2013-02-18T03:01:14.347 回答
0

我认为您必须使用反射 api,如果您想要该类实例,则必须在运行时检查任何对象...我认为您的问题是您不想将条件设为静态以及如何为不同的不同动态设置条件动物,今天它的狗,老虎明天它的牛等等......所以请使用refelction api

于 2013-02-18T02:42:00.853 回答