zoukankan      html  css  js  c++  java
  • new 对象和Class的getInstance()方法的差别?

    创建对象时的差别

    1、new 对象包含2步,
    1)载入类;
    2)而且实例化。


    2、Class的对象.getInstance(),只不过实例化。
    也就是说。在运行 Class的对象.getInstance() 之前一定要先载入相应的类。


    //演示样例代码
    /**
     * new 对象和Class的对象.getInstance()的差别?<p>
     * 答:<br>
     * 1、new 对象包含2步。<br>
     *    1)载入类。<br>
     *    2)而且实例化。<p>
     *    
     * 2、Class的对象.getInstance(),只不过实例化。<br>
     *    也就是说。在运行 Class的对象.getInstance() 之前一定要先载入相应的类。<br>
     * @author gzh
     *
     */
    public class Main1 {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    //		Word word = new Word();	
    //		ClassLoader classLoader = word.getClass().getClassLoader();
    		ClassLoader classLoader = Word.class.getClassLoader();
    		System.out.println(classLoader); //注:Word.class是由sun.misc.Launcher$AppClassLoader@1372a1a载入器载入的
    		
    		try {
    			Class<?> c = classLoader.loadClass(args[0]); //1、必需要先载入该类;
    			
    			Object o1 = c.newInstance(); //2、然后,才干够使用.newInstance()方法来新建实例对象。
    			Object o2 = c.newInstance();
    		} 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();
    		}
    
    	}
    
    }
    






    详细应用上的差别

    既然使用newInstance()构造对象的地方通过newkeyword也能够创建对象。为什么又会使用newInstance()来创建对象呢?
        如果定义了一个接口Door,開始的时候是用木门的。定义为一个类WoodenDoor,在程序里就要这样写 Door door = new WoodenDoor() 。

    如果后来生活条件提高。换为自己主动门了。定义一个类AutoDoor,这时程序就要改写为 Door door = new AutoDoor() 。

    尽管仅仅是改个标识符,如果这种语句特别多,修改还是挺大的。于是出现了工厂模式,全部Door的实例都由DoorFactory提供。这时换一种门的时候。仅仅须要把工厂的生产模式改一下,还是要改一点代码。


        而假设使用newInstance(),则能够在不改变代码的情况下。换为第二种Door。

    详细方法是把Door的详细实现类的类名放到配置文件里,通过newInstance()生成实例。这样,改变第二种Door的时候。仅仅改配置文件就能够了。演示样例代码例如以下:
    String className = 从配置文件读取Door的详细实现类的类名; 
    Door door = (Door) Class.forName(className).newInstance();


    总结上面的3种情况例如以下。
    1、直接new 对象。
    2、使用接口。硬编码接口的实现类——假设要更改接口的实现类的话,则必需要改动源代码,而且又一次编译源代码。
    3、使用接口。而且从配置文件获取接口的实现类——仅仅须要改动配置文件就可以。
  • 相关阅读:
    5.4 省选模拟赛 修改 线段树优化dp 线段树上二分
    一本通 高手训练 1782 分层图 状压dp
    luogu P3830 [SHOI2012]随机树 期望 dp
    5.2 省选模拟赛 或许 线型基
    luogu P4562 [JXOI2018]游戏 组合数学
    一本通 高手训练 1781 死亡之树 状态压缩dp
    luogu P4726 【模板】多项式指数函数 多项式 exp 牛顿迭代 泰勒展开
    4.28 省选模拟赛 负环 倍增 矩阵乘法 dp
    HDU 1756 Cupid's Arrow 计算几何 判断一个点是否在多边形内
    一本通 高手训练 1763 简单树 可持久化线段树 树链刨分 标记永久化
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6964723.html
Copyright © 2011-2022 走看看