2013-02-18 184 views
2

,对不起,我是初学者刚开始使用Java和我遇到这个问题Java中的对象设置为一个未知的类类型

我有两个班,说他们是

class Dog { 

} 

class Cat { 

} 

然后,我创建了与这两个

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

我想设置一个变量等于随机对象从我的阵列或者一个充满了一个数组,但我不知道它来自哪个类。有没有办法做到这一点?

+2

你可以在运行时检查一个对象的类('obj.getClass()'),但这并不一定能帮你从糟糕的设计中解脱出来。你想达到什么目的? – Perception 2013-02-18 02:28:35

+0

if(myAnimalObj instanceof CAT)或if(myAnimalObj instanceof CAT) – Jayamohan 2013-02-18 02:33:20

+0

好吧我试图模拟一个游戏,你有一只猫还是一只狗,以及根据应该发生的不同事情。我正在循环访问数组,并尝试设置一个等于当前单元格的变量,然后使用if语句来检查它是否为狗或猫。 – 2013-02-18 02:33:26

回答

1

好吧,假设你的数组充满了两个班的一个实例,你可以这样做:

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

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

+0

哦,好的。好吧,如果我做你给的例子,我可以设置一个新的对象到当前的一个。喜欢狗myDog = myAnimal [x] [x]? – 2013-02-18 02:39:43

+0

让他们在两个单独的数组中的好处是您可以创建一个类Dog的数组和一个Cat类的数组。所以当你这样做时,你不必创建一个新的对象。你可以说,我随机选择的动物是catArray [5]。您可以使用数组中的该元素工作目录。例如catArray [5] .someCatFunction() – 2013-02-18 02:42:48

+0

我应该说阵列解决方案会起作用,但是你真正需要的是创建一个像Code-Guru一样的类动物。这样你就可以拥有一系列可能是猫或狗的动物。 – 2013-02-18 02:53:18

0

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

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概念。

+0

没有创建一个单独的类,我可以只是调用你已经列出的方法。像if(instanceof Dog){myAnimal [0] [0] .speak()} – 2013-02-18 03:50:30

+0

@BillyThompson'instanceof'是一个二元运算符。这意味着它需要*两个*参数,如'if(myAnimal [0] [0] instanceof Dog){myAnimal [0] [0] .speak();}'。是的,如果'Animal'有一个具体的'speak()'方法,你可以*做到这一点。但是,不管动物是狗还是猫,它都会做同样的事情。我在回答中给出的建议说明了多态的概念。一个好处是,你不需要像你所建议的那样的“if”陈述。您还可以使用更少的代码轻松添加更多的动物,如“马”,“牛”,“羊”,“鸭”等。 – 2013-02-20 01:11:02

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

相关问题