创建对象时的差别

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、使用接口。而且从配置文件获取接口的实现类——仅仅须要改动配置文件就可以。

new 对象和Class的getInstance()方法的差别?的更多相关文章

  1. 使用getInstance()方法的原因及作用

    使用getInstance()方法的原因及作用 先举例说明: 下面是一个例子,为什么要把这个类实例化?有什么好处? //实例化 public static DBConnect instance; pu ...

  2. JSon 对象转字符的一些方法

    引用System.Web.Entity.dll public static string ToJSON(this object obj) { JavaScriptSerializer serializ ...

  3. XE3随笔6:SuperObject 的 JSON 对象中还可以包含 "方法"

    SuperObject 的 JSON 对象中还可以包含 "方法", 这太有意思了; 其方法的格式是: procedure Method(const This, Params: IS ...

  4. Jquery中使用setInterval和setTimeout会提示缺少对象的错误,解决方法如下:

    直接在ready中调用其他方法,会提示缺少对象的错误,解决方法如下: 方法1. 应用jQuery的扩展可以解决这个问题. $(document).ready(function(){ $.extend( ...

  5. SQL Server中查询用户的对象权限和角色的方法

    --SQL Server中查询用户的对象权限和角色的方法 -- 查询用户的object权限 exec sp_helprotect NULL, 'sa' -- 查询用户拥有的role exec sp_h ...

  6. C++11用于计算函数对象返回类型的统一方法

    [C++11用于计算函数对象返回类型的统一方法] 模板 std::result_of 被TR1 引进且被 C++11 所采纳,可允许我们决定和使用一个仿函数其回返值的类别.底下,CalculusVer ...

  7. Android反射出一个类中的其他类对象并调用其对应方法

    MainActivity如下: package cn.testreflect; import java.lang.reflect.Field; import java.lang.reflect.Met ...

  8. python的str,unicode对象的encode和decode方法

    python的str,unicode对象的encode和decode方法 python中的str对象其实就是"8-bit string" ,字节字符串,本质上类似java中的byt ...

  9. 通过supper()有参构造器,完成子类对象调用父类属性的方法,并完成赋值

    package com.Summer_0426.cn; /** * @author Summer * 通过supper()有参构造器,完成子类对象调用父类属性的方法,并完成赋值 * */ public ...

随机推荐

  1. Python数学实现二元一次方程

    import cmath import math import sys def get_float(msg,allow_zero): x = None while x is None: try: x ...

  2. JavaScript中的“闭包”

    什么是JavaScript中的“闭包”?举一个例子. 闭包是一个内部函数,它可以访问外部(封闭)函数的作用域链中的变量.闭包可以访问三个范围内的变量;具体来说: (1)变量在其自己的范围内, (2)封 ...

  3. Oracle安装和使用说明

    很久没有安装Oracle了,今天试了一下重新安装Oracle,然后做了一个总结: 一.Oracle 下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可. 路径名称中,最好不要 ...

  4. [CSS3] The picture element

    <picture> <source media="(min-width: 1000px)" srcset="kookaburra_large_1x.jp ...

  5. 博客迁移到reetsee.com

    正如上一篇博客所言.眼下CSDN的博客已经基本完毕它的使命了.感谢CSDN带给我的全部美好回顾. 如今我想尝试一下自己维护一个博客,所以博客的全部内容都迁移到了reetsee.com. 以后博客更新会 ...

  6. 110_leetcode_Best Time to Buy and sell Stock II

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  7. 2 怎样解析XML文件或字符串

    1 引用XML文件 2 使用XMLReader解析文本字符串 3 使用XMLReader方法读取XML数据 详细代码实现例如以下: //初始化一个XML字符串 String xmlString = @ ...

  8. oracle 时间戳TIMESTAMP

    //数据库 UPDATETIMESTAMP TIMESTAMP(6) //dto /** 更新时间戳 **/ private String updatetimestamp; //dao //插入操作 ...

  9. ES线程池设置

    每个Elasticsearch节点内部都维护着多个线程池,如index.search.get.bulk等,用户可以修改线程池的类型和大小,线程池默认大小跟CPU逻辑一致 一.查看当前线程组状态 cur ...

  10. [jzoj 5926] [NOIP2018模拟10.25] naive 的图 解题报告(kruskal重构树+二维数点)

    题目链接: https://jzoj.net/senior/#main/show/5926 题目: 题解: 显然最小的最大路径在最小生成树上(最小生成树=最小瓶颈生成树) 于是我们建出kruskal重 ...