多态性和使用String创建Object

时间:2014-11-23 13:36:49

标签: java interface polymorphism

我声明了一个类似以下的接口

public interface One {
    void setNo(int no);
}

然后我有一个类来实现接口

public class Two implements One{
    private int no;

    @Override
    public void setNo(int no){
        this.no = no;
    }
}

我将有很多类来实现接口,然后我想根据用户输入创建相应的Object。

让我们说我们将三,四,五类描述为两类。

用户选择创建类Three。所以我尝试做类似下面的事情

One base;

Class c = Class.forName("Three");
base = (One) c.newInstance();

base.setNo(5);

对base.setNo()的调用失败。我这样做了吗?

错误

java.lang.ClassNotFoundException: Three
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:260)
    at com.company.Main.main(Main.java:33)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

2 个答案:

答案 0 :(得分:2)

包含包名称 所以,如果你的课程三包com.test那么你应该这样写

Class c = Class.forName("com.test.Three");
    base = (One) c.newInstance();

    base.setNo(5);

答案 1 :(得分:1)

它应该给出编译错误:

无法从One

降低继承方法的可见性

尝试将方法设为公开。

public class Two implements One{
    private int no;

    @Override
    public void setNo(int no){
        this.no = no;
    }
}

我不知道你在哪里创建三节课,但我可以帮助你的两节课。

public class Two implements One {
     private int no;

        @Override
        public void setNo(int no){
            this.no = no;
            System.out.println("No-->");
        }
        public static void main(String[] args) {
            One base;

            Class c;
            try {
                c = Class.forName("com.test.stackoverflow.Two");
                base = (One) c.newInstance();
                base.setNo(5);
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
}