Java:使用对象的字符串输入创建对象';姓名

Java:使用对象的字符串输入创建对象';姓名,java,object,Java,Object,我有两门课,狗和猫: class Dog{ public void speak(){ System.out.print("Woof!"); } } class Cat{ public void speak(){ System.out.print("Meow!"); } } 在我的主体中,我把名字作为字符串,或者是“猫”,或者是“狗” 然后“猫”和“狗”都可以扩展动物并超越它的方法。在不使用其他方法/使用if语句的情况下,是否还有其他方法可

我有两门课,狗和猫:

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

class Cat{
   public void speak(){
       System.out.print("Meow!");
   }
}
在我的主体中,我把名字作为字符串,或者是“猫”,或者是“狗”

然后“猫”和“狗”都可以扩展动物并超越它的方法。在不使用其他方法/使用if语句的情况下,是否还有其他方法可以做到这一点?(包括开关箱、三元操作器)。提前谢谢

另一个问题: 如果我将中方法的名称也作为输入,我将如何调用它?例如:

class Dog{
    public void speak(){}
    public void bark(){}
}

如果我将“speak”或“bark”作为字符串接收,那么在不使用If语句的情况下如何调用该方法?

您的思路是正确的。最简单的方法是创建一个animal类,让dog和cat继承该类,并使它们都实现自己版本的speak()。您不想创建另一个类有什么原因吗

您可以使用和进行反射


不过,创建一个动物类确实是最干净的方法。是什么阻止了你这么做呢?

好的,这里有两种按偏好排序的方法:

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

class Dog extends Animal {
    @Override
    public void speak() {
        System.out.println("Woof woof");
    }
}

class Cat extends Animal {
    @Override
    public void speak() {
        System.out.println("Miauw");
    }
}

public static void main(String[] args) {
    String type = "Dog";
    Class<?> clazz;
    try {
        clazz = Class.forName(type);
        Animal pet = (Animal) clazz.newInstance();
        pet.speak();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

您不必创建
动物-创建
接口

interface Animal{
    public void speak();
}
并让
Cat
Dog
实现它。然后在
main()
中:

Class cls=Class.forName(name);
Animal=cls.newInstance();
动物。说();
无需强制转换或使用if/else

使用继承/抽象类的唯一原因是当您想要重用功能时(实现一个方法一次并在几个类中使用它)。否则-更好地使用接口


至于方法名,如果您想要“wise-ass”解决方案,请使用
开关
(Java 7支持)。否则,请参阅@immibis的答案。

您刚才不是自己回答了吗?只需使用基类
Animal
并重写
speak()
。哪里需要控件结构?我不想创建另一个类。我想知道有没有办法不用它。
abstract class Animal {
    public abstract void speak();
}

class Dog extends Animal {
    @Override
    public void speak() {
        System.out.println("Woof woof");
    }
}

class Cat extends Animal {
    @Override
    public void speak() {
        System.out.println("Miauw");
    }
}

public static void main(String[] args) {
    String type = "Dog";
    Class<?> clazz;
    try {
        clazz = Class.forName(type);
        Animal pet = (Animal) clazz.newInstance();
        pet.speak();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
public class Test {
    public static void main(String[] args) {
        String type = "Dog";
        Class<?> clazz;
        try {
            clazz = Class.forName(type);
            for(Method method : clazz.getMethods()){
                if(method.getName().equals("speak")){
                    method.invoke(clazz.newInstance(), null);
                }
            }
        } catch (CException e) {
            e.printStackTrace();
        }
    }
}
interface Animal{
    public void speak();
}
Class<?> cls = Class.forName(name);
Animal animal = cls.newInstance();
animal.speak();