Java初始化子类

Java初始化子类,java,instantiation,subclass,Java,Instantiation,Subclass,初始化接口的已实现类(由某些逻辑确定)的适当方式是什么 范例 IAnaimal is an interface Cat -> IAnimal Dog -> IAnimal Cow -> IAnimal int x = in.nextInt(); IAnimal animal = null; if(x==1) animal = new Dog(); else if(x==2) animal = new Cat(); else animal = new Cow();

初始化接口的已实现类(由某些逻辑确定)的适当方式是什么

范例

IAnaimal is an interface
Cat -> IAnimal
Dog -> IAnimal
Cow -> IAnimal


int x = in.nextInt();
IAnimal animal = null;

if(x==1)
 animal = new Dog();
else if(x==2)
 animal = new Cat();
else
 animal = new Cow();

animal.destroyManKind();

这是正确的方法吗?有没有一种更专业的方法可以做到这一点?

假设他们有一个普通的超类动物,它可能有一个接受int的静态生成器方法,你可以这样做

IAnimal animal = Animal.build(x);
在哪里

public class Animal{
public static IAnimal build(int x){

 if(x==1) return new Dog();
 else if(x==2) return new Cat();

 return new Cow();
}}

你的做法没有错。您也可以查看。

我有一种更清晰的方式来读取名称,而不是1、2和3,但在这种情况下,您可以使用开关

int choice = in.nextInt();

switch(choice) {
  case 1: animal = new Dog(); break;
  case 2: animal = new Cat(); break;
  default: animal = new Cow(); break;
}
或者使用字符串开关

String choice = in.next();

switch(choice.toLowerCase()) {
  case "dog": animal = new Dog(); break;
  case "cat": animal = new Cat(); break;
  case "cow": animal = new Cow(); break;
  default: // error
}

我更喜欢动物阵列

IAnimal animal = null;

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

animal = animals[x]

您确定
Cow
是一个有用的默认值吗?

在.next()中的
来自哪里?你可以使用
开关而不是
if-else of-else`它比你想象的要简单得多:1)一个“接口”是由一个具体的类实现的。2) 具体类由其构造函数初始化。就这么简单!:)您可以简单地使用相同
或直接类型的引用和对象<代码>狗d=新狗()这是设计模式参考吗?我是说,我同意。我想做这样的事情。那个构建方法是什么样子的?我假设这会把IAnaimal变成一个抽象类?我不喜欢这种方法。您正在实例化3个对象,而您只需要一个。
    switch (x){
      case 1: 
       animal = new Dog();
       break;
      case 2:
       animal = new Cat();
       break;
      default
       animal = new Cow();
    }