2014-11-23 56 views
0

我宣佈類似下面的多態性與對象的創建使用字符串

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

的接口,那麼我有一個類實現該接口

public class Two implements One{ 
    private int no; 

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

我將有很多的類來實現的接口,然後我想根據用戶輸入創建相應的對象。

假設我們將三,四,五類描述爲兩類。

用戶選擇創建三類。所以我嘗試做下面的事情

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) 
+0

有什麼錯誤?上面的代碼是甚至編譯的? – SMA 2014-11-23 13:38:27

+1

嘗試使用完全限定的類名稱 – Eran 2014-11-23 13:39:56

+0

另外,如果Three的代碼類似於Two,'setNo'是封裝私有的,這意味着您無法從不在同一個包中的類訪問它。 – Eran 2014-11-23 13:42:07

回答

2

包括包名 因此,如果您在com.test包類三,那麼你應該寫這樣

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

    base.setNo(5); 
+0

它工作,但爲什麼? – kechapito 2014-11-23 13:50:58

+1

很明顯,因爲forName方法需要完全限定的類名,例如有兩個具有相同名稱的類/文件「List」(java.awt和java.utils)您認爲forName方法如何區分它們而不使用包名? – Vilen 2014-11-23 13:54:10

1

它應該給編譯錯誤:

不能減少繼承方法的可視性一個

儘量使方法公開。

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(); 
      } 

     } 
}