创建对象时的差别

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. 使用展开操符作替代 .apply() (prefer-spread)

    在ES2015以前,你必须使用Function.prototype.apply()来调用可变函数. var args = [1, 2, 3, 4]; Math.max.apply(Math, args ...

  2. C/C++ Swap without using extra variable

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50255379 对于可以线性运算的变量, ...

  3. linux gnome kde点滴

    2014.12.08 下面切换的方法对于fedora 17没有效果,对于fedora 17, 要使用system-switch-displaymanager,出现 点击相应的选项,然后就进入相应的启动 ...

  4. OSGI项目中获取文件路径

    假设想依据给定的文件名创建一个File实例,你可能会这么写: File file = new File(当前类.class.getResource("config").toURI( ...

  5. oracle实现自增id

    --oracle实现自增id --创建一张T_StudentInfo表 create table T_StudentInfo ( "id" integer not null pri ...

  6. xBIM 基础10 WeXplorer 浏览器检查

    系列目录    [已更新最新开发文章,点击查看详细]  在上一篇 <xBIM基础 09 WeXplorer 基本应用> 已经提到,查看器不会在所有浏览器的所有设备上运行.为了操作效率和简单 ...

  7. POJ 2190 模拟

    按照题意模拟就好- 注意"X"只能出现在最后一位... // by SiriusRen #include <cstdio> using namespace std; c ...

  8. Java7里try-with-resources分析--转

    原文地址:http://blog.csdn.net/hengyunabc/article/details/18459463 这个所谓的try-with-resources,是个语法糖.实际上就是自动调 ...

  9. sql server 去掉某字段左边的0

    比如:将以下Code字段 Code 000 001 002 ... 009 010 依次去掉左边的0,000替换为0,001替换为1,010替换为10,以此类推 Code 0 1 2 ... 9 10 ...

  10. 分库分表中间件Sharding-JDBC

    数据库分库分表从互联网时代开启至今,一直是热门话题.在NoSQL横行的今天,关系型数据库凭借其稳定.查询灵活.兼容等特性,仍被大多数公司作为首选数据库.因此,合理采用分库分表技术应对海量数据和高并发对 ...