多态性或更改变量java的名称

多态性或更改变量java的名称,java,inheritance,polymorphism,Java,Inheritance,Polymorphism,我想通过选择用户来更改变量的名称。我知道它可以通过Mab来实现(不是很吸引人),但我认为它也可以通过多态性来实现,至少可以模拟它。这很难解释,因此下面的代码可以更好地说明它。谢谢 public class Main { public static void main(String[] args) { GenericObject o; o = new Object1(10, 10);

我想通过选择用户来更改变量的名称。我知道它可以通过Mab来实现(不是很吸引人),但我认为它也可以通过多态性来实现,至少可以模拟它。这很难解释,因此下面的代码可以更好地说明它。谢谢

        public class Main {
            public static void main(String[] args) {
                GenericObject o;

                o = new Object1(10, 10);
                o.wh();
                System.out.println(o.w); // Output: 3 (ok)
                System.out.println(o.h); // Output: 10 (ok)

                o = new Object2(10, 10);
                o.wh();
                System.out.println(o.w); // Output: 7 (ok)
                System.out.println(o.h); // Output: 4 (ok)

                String inputFromUser = "1";
                o = new Object + inputFromUser + (10, 10); /*I know that is an absurd, just to illustrate...
if polymorphism can solve this problem, I thik it's the best option. So how use it here?
I don't wanna use ifs or switchs, I will use more than 300 classes*/
                o.wh();
                System.out.println(o.w); // Output: 3 (that's what I wanna obtain)
                System.out.println(o.h); // Output: 10 (that's what I wanna obtain)
            }
        }
        abstract class GenericObject {
            int w, h, x, y;
            GenericObject (int x, int y) {
                this.x = x;
                this.y = y;
            }
            public abstract void wh();
        }
        class Object1 extends GenericObject{
            Object1 (int x, int y) {
                super(x, y);
            }
            @Override
            public void wh () {
                w = 3;
                h = 10;
            }
        }
        class Object2 extends GenericObject{
            Object2 (int x, int y) {
                super(x, y);
            }
            @Override
            public void wh () {
                w = 7;
                h = 4;
            }
        }

希望下面的代码能帮助你

            HashMap<String, GenericObject > allTypes = new HashMap<>();
            allTypes.put("1", new Object1(10, 10));
            allTypes.put("2", new Object2(10, 10));

            String inputFromUser = "1";
            GenericObject o = allTypes.get(inputFromUser);
            o.wh();
            System.out.println(o.w); // Output: 3 
            System.out.println(o.h); // Output: 10
HashMap allTypes=newhashmap();
allTypes.put(“1”,新对象1(10,10));
allTypes.put(“2”,新对象2(10,10));
字符串inputFromUser=“1”;
GenericObject o=allTypes.get(inputFromUser);
o、 wh();
系统输出打印LN(o.w);//产出:3
系统输出打印LN(o.h);//产出:10

抛开所有设计的味道不谈,我认为您确实在使用反射寻找答案。我认为您可以使用以下代码片段来完成您想要的:

    // dynamically specify the class name based on the user's input.
    Class<?> typeFromUser = Class.forName("Object" + inputFromUser);
    // grab the correct package-private or public constructor whose type
    // parameters are 2 primitive ints
    java.lang.reflect.Constructor<?> constructor =
        typeFromUser.getDeclaredConstructor(Integer.TYPE, Integer.TYPE);
    // reflectively invoke the constructor with the two int values
    Object obj = constructor.newInstance(10, 10);
    // the instantiated object is of a raw type, cast it to the correct type
    o = (GenericObject) obj;
//根据用户的输入动态指定类名。
Class typeFromUser=Class.forName(“对象”+inputFromUser);
//获取正确的包私有或公共构造函数,其类型为
//参数为2个基本整数
java.lang.reflect.Constructor=
typeFromUser.getDeclaredConstructor(Integer.TYPE,Integer.TYPE);
//使用两个int值反射地调用构造函数
objectobj=constructor.newInstance(10,10);
//实例化的对象是原始类型,请将其转换为正确的类型
o=(GenericObject)对象;

我还尝试了这段代码,您可以看到。

我认为您可以使用反射机制来实现这一点。下面是示例代码段:

    String clsName = <your input(Object1 or Object2)>;
    Class<?> clazz = Class.forName(clsName);
    Constructor<?> cst = clazz.getDeclaredConstructor(int.class, int.class);
    GenericObject obj = null;
    if(clsName.equals("Object1")) {
        obj = (Object1)cst.newInstance(10, 10);
    } else if(clsName.equals("Object2")) {
        obj = clsName.equals("Object1")
    }
String clsName=;
Class clazz=Class.forName(clsName);
构造函数cst=clazz.getDeclaredConstructor(int.class,int.class);
GenericObject obj=null;
if(clsName.equals(“Object1”)){
obj=(Object1)cst.newInstance(10,10);
}else if(clsName.equals(“Object2”)){
obj=clsName.equals(“Object1”)
}

拥有一个带有名称字段或整数id的通用对象似乎是一样的。还可以将对象映射到关键点。但是为什么呢?允许用户参与这些事情只是一种抽象,可以说是暴露了你的本质。不,多态性不是最好的选择。多态性是OO编程的一个非常重要的特性,但这并不意味着它是所有事情的最佳工具。你的目标应该是使用最适合工作的工具,而不是最酷或最迷人的工具。而您正试图实现的正是
Map
的目的,因此
Map
是最佳选择。