在Java中将对象设置为未知类类型

时间:2013-02-18 02:26:50

标签: java arrays class

抱歉,我刚刚开始使用Java,我遇到了这个问题

我有两个班级,说他们是

class Dog {

}

class Cat {

}

然后我创建了一个充满这两个

之一的数组
Object[][] myAnimal = new Object[4][5];

我想在我的数组中设置一个等于随机对象的变量,但我不知道它来自哪个类。有没有办法做到这一点?

4 个答案:

答案 0 :(得分: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概念。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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

答案 3 :(得分:0)

我认为你必须使用反射api,如果你想要那个类实例,它必须在运行时检查任何对象...我认为你的问题是你不想把条件静态以及如何动态放置条件对于不同的动物,今天它的狗,老虎tomrrow它的牛...等所以plz使用refelction api