`

java创建对象的几种方式

    博客分类:
  • java
 
阅读更多


(1) 用new语句创建对象,这是最常见的创建对象的方法。
(2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
(3) 调用对象的clone()方法。
(4) 运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。

 

一.用new语句创建对象

User user = new User()

 

二.运用反射手段
(1)调用java.lang.Class.newInstance()

Class.forName(classname).newInstance()
Wife wife = (Wife) Class.forName("com.java.clone.Wife").newInstance();

 

 (2)调用java.lang.reflect.Constructor类的newInstance()

Constructor<Wife> constructor = Wife.class.getDeclaredConstructor(int.class,String.class);
Wife wife = (Wife) constructor.newInstance(1,"nihao");

 

三.调用对象的clone()方法
详情参考:http://ncs123.iteye.com/blog/1775631

 

Wife wife = new Wife(1,"wang");
Wife wife2 = null;
wife2 = (Wife) wife.clone();//运用clone()方法产生新对象

 

四.运用反序列化手段
被序列化的对象必须implements Serializable

public class BeanUtil {

	@SuppressWarnings("unchecked")
	public static <T> T cloneTo(T src) throws RuntimeException {
		ByteArrayOutputStream memoryBuffer = new ByteArrayOutputStream();
		ObjectOutputStream out = null;
		ObjectInputStream in = null;
		T dist = null;

		try {
			out = new ObjectOutputStream(memoryBuffer);
			out.writeObject(src);
			out.flush();
			in = new ObjectInputStream(new ByteArrayInputStream(
					memoryBuffer.toByteArray()));
			dist = (T) in.readObject();

		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			if (out != null)
				try {
					out.close();
					out = null;
				} catch (IOException e) {
					throw new RuntimeException(e);
				}
			if (in != null)
				try {
					in.close();
					in = null;
				} catch (IOException e) {
					throw new RuntimeException(e);
				}
		}

		return dist;
	}

	public static void main(String[] args){
		Husband husband = new Husband(1);
		Wife wife = new Wife(1,"jin");
		husband.setWife(wife);
		Husband husband2 = cloneTo(husband);//运用反序列生成了一个对象
	}
}

 

 

 

分享到:
评论
3 楼 dengminghua1016 2014-02-14  
doris1bruce 写道
一、二、都会明确的显式的调用构造函数  。
http://www.07net01.com/program/352263.html
第一,反射的目的就是为了扩展未知的应用。比如,我们写好了一个软件,其中定义了一些接口,程序已经过编译并且发布了,当我们以后需要扩展功能时,不可能去修改已经安装在别人机器上的软件源码,此时我们只需要另写一个插件,让其实现某些接口即可,程序运行时,通过反射技术动态的创建和编译新写的类,并获知其内部细节,就可以调用其方法了;

第二,在编码阶段不知道那个类名,要在运行期从配置文件读取类名, 这时候就没有办法以new的方式硬编码,而必须用到反射才能创建这个对象。

三、是在内存上对已有对象的影印 所以不会调用构造函数 。
    http://289972458.iteye.com/blog/1326413
在实际编程过程,有时候我们会遇到一种情况:当你有一个对象A,在某一个时刻,A已经保存了对应的属性值,而且这些值本身是有效的,这个时候可能需要一个和A完全相同的对象B,并且当B里面的属性值发生变化的时候,A中的属性值不受影响,可以理解为A和B独立,但是B的初始化不是按照我们平时创建该对象的时候的初始化操作,B的初始化数据完全来自A。对Java存储模型了解的人都明白,在Java里面如果针对两个对象引用采取赋值操作的时候,仅仅是让两个引用指向了同一对象,如果其中一个引用里面的对象属性改变的时候会影响另外一个对象属性跟着改变,所以Java语言本身的对象赋值语句是不能完成上边的需求的。

四、是从文件中还原类的对象 也不会调用构造函数。
http://blog.csdn.net/quanleilei123/article/details/5139174
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,即Java对象序列号,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象,即反序列化。

把Java对象转换为字节序列的过程称为对象的序列化。

把字节序列恢复为Java对象的过程称为对象的反序列化。

对象的序列化主要有两种用途:

1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

2) 在网络上传送对象的字节序列。

2 楼 doris1bruce 2013-07-28  
一、二、都会明确的显式的调用构造函数  。
http://www.07net01.com/program/352263.html
第一,反射的目的就是为了扩展未知的应用。比如,我们写好了一个软件,其中定义了一些接口,程序已经过编译并且发布了,当我们以后需要扩展功能时,不可能去修改已经安装在别人机器上的软件源码,此时我们只需要另写一个插件,让其实现某些接口即可,程序运行时,通过反射技术动态的创建和编译新写的类,并获知其内部细节,就可以调用其方法了;

第二,在编码阶段不知道那个类名,要在运行期从配置文件读取类名, 这时候就没有办法以new的方式硬编码,而必须用到反射才能创建这个对象。

三、是在内存上对已有对象的影印 所以不会调用构造函数 。
    http://289972458.iteye.com/blog/1326413
在实际编程过程,有时候我们会遇到一种情况:当你有一个对象A,在某一个时刻,A已经保存了对应的属性值,而且这些值本身是有效的,这个时候可能需要一个和A完全相同的对象B,并且当B里面的属性值发生变化的时候,A中的属性值不受影响,可以理解为A和B独立,但是B的初始化不是按照我们平时创建该对象的时候的初始化操作,B的初始化数据完全来自A。对Java存储模型了解的人都明白,在Java里面如果针对两个对象引用采取赋值操作的时候,仅仅是让两个引用指向了同一对象,如果其中一个引用里面的对象属性改变的时候会影响另外一个对象属性跟着改变,所以Java语言本身的对象赋值语句是不能完成上边的需求的。

四、是从文件中还原类的对象 也不会调用构造函数。
http://blog.csdn.net/quanleilei123/article/details/5139174
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,即Java对象序列号,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象,即反序列化。

把Java对象转换为字节序列的过程称为对象的序列化。

把字节序列恢复为Java对象的过程称为对象的反序列化。

对象的序列化主要有两种用途:

1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

2) 在网络上传送对象的字节序列。
1 楼 doris1bruce 2013-07-28  
一、二、都会明确的显式的调用构造函数  。
http://www.07net01.com/program/352263.html
第一,反射的目的就是为了扩展未知的应用。比如,我们写好了一个软件,其中定义了一些接口,程序已经过编译并且发布了,当我们以后需要扩展功能时,不可能去修改已经安装在别人机器上的软件源码,此时我们只需要另写一个插件,让其实现某些接口即可,程序运行时,通过反射技术动态的创建和编译新写的类,并获知其内部细节,就可以调用其方法了;

第二,在编码阶段不知道那个类名,要在运行期从配置文件读取类名, 这时候就没有办法以new的方式硬编码,而必须用到反射才能创建这个对象。

三、是在内存上对已有对象的影印 所以不会调用构造函数 。 http://289972458.iteye.com/blog/1326413
在实际编程过程,有时候我们会遇到一种情况:当你有一个对象A,在某一个时刻,A已经保存了对应的属性值,而且这些值本身是有效的,这个时候可能需要一个和A完全相同的对象B,并且当B里面的属性值发生变化的时候,A中的属性值不受影响,可以理解为A和B独立,但是B的初始化不是按照我们平时创建该对象的时候的初始化操作,B的初始化数据完全来自A。对Java存储模型了解的人都明白,在Java里面如果针对两个对象引用采取赋值操作的时候,仅仅是让两个引用指向了同一对象,如果其中一个引用里面的对象属性改变的时候会影响另外一个对象属性跟着改变,所以Java语言本身的对象赋值语句是不能完成上边的需求的。
四、是从文件中还原类的对象 也不会调用构造函数。

http://blog.csdn.net/quanleilei123/article/details/5139174
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,即Java对象序列号,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象,即反序列化。

把Java对象转换为字节序列的过程称为对象的序列化。

把字节序列恢复为Java对象的过程称为对象的反序列化。

对象的序列化主要有两种用途:

1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

2) 在网络上传送对象的字节序列。

相关推荐

    java面向对象之JVM创建及分配策略方法详解.docx

    在Java中我们有几种方式可以创建一个新的对象呢?总共有以下几种方式: new关键字 反射 clone 反序列化 Unsafe.allocateInstance 为了便于说明和理解,下文仅针对new出来的对象进行讨论。

    Java创建对象的几种方法

    主要为大家详细介绍了Java创建对象的几种方法,使用new创建、使用object.clone()创建、使用反序列化创建等,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Java中创建对象的4种方法

    通过new创建对象 会创建几个完全不相同的对象 实体类: package cn.xiaov.creatobject; public class Person { private String name; private int age; public String getName() { return name; } public void...

    java开发的几种常见设计模式

    java开发的几种常见设计模式. 工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。 为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new...

    几种常用的Java数据源解决方案

    Java中的数据源就是javax.sql.DataSource。DataSource的创建可以有不同的实现。 -JNDI方式创建DataSource -Apache提供的简单连接池创建数据源 -C3P0方式创建数据源 -Proxool方式创建数据源 -BoneCP方式创建数据源

    javascript创建对象的3种方法

    第一种创建对象的方式: 创建JSON对象 推荐使用的场合: 作为函数的参数,临时只用一次的场景。比如设置函数原型对象。 var object = { name: "Eric", age: 24, sayHi: function(){ console.log("My name is ...

    在Java中优雅而简洁的创建对象的方法总结

    一般在Java里创建一个对象,有常用的几种方式 正常通过 new 操作符; 反射调用 Class 或 java.lang.reflect.Constructor 的 newInstance()方法 克隆调用现有对象的 clone()方法 反序列化调用 java.io....

    Java几种线程池类型介绍及使用.docx

    每次通过new Thread()创建对象性能不佳。 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。 缺乏更多功能,如定时执行、定期执行、线程中断。 2.使用Java线程池的...

    Java面试经典题,对JAVA面试很有帮助

    16.Java创建对象有几种方式 17.有没有可能两个不相等的对象有相同的hashcode 18.深拷贝和浅拷贝的区别是什么 19.final有哪些用法 20.static都有哪些用法 21.3*0.1 == 0.3返回值是什么 22.a=a+b与a+=b有什么区别吗 23...

    完成Java面向对象程序设计实验课的心得体会(1).doc

    也就是说,类的实例化就是 创建对象的过程类的实例就是对象。 ----------------------- 完成Java面向对象程序设计实验课的心得体会(1)全文共6页,当前为第1页。 完成Java面向对象程序设计实验课的心得体会(1)全文共6...

    什么是Java的数据库连接技术?Java中常用的数据库连接方式有哪些?(java面试题附答案).txt

    Java中常用的数据库连接方式有以下几种: JDBC(Java Database Connectivity): JDBC是Java提供的标准数据库连接API,可以与各种关系型数据库进行交互。JDBC提供了一组接口和类,用于连接数据库、执行SQL语句并...

    JAVA上百实例源码以及开源项目源代码

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    JAVA上百实例源码以及开源项目

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    javascript创建对象的几种模式介绍

    在js中有几种模式可以创建对象,通过对象操作所包含的属性与方法。 一般来说,构造函数名称的第一个字母为大写字母,非构造函数名称的第一个字母为小写字母,当然,构造函数与一般函数唯一的区别只是调用的方式不同...

    Java高级程序设计实战教程第五章-Java序列化机制.pptx

    5.2 相关知识 5.2.1 序列化的概念 5.2.2 序列化应用 5.2.3 序列化的几种方式 5.2.4 对象实现机制 Java高级程序设计实战教程第五章-Java序列化机制全文共15页,当前为第3页。 5.2.1 序列化的概念 将在内存中的各种...

    java面试题目.docx

    答:String创建对象有两种情况: 第一种:如果String常量池中已经创建了“xyz”,则不会继续创建,此时只创建了一个对象new String(“xyz”) 第二种:如果String常量池中没有创建“xyz”,则会创建两个对象,一个...

    Java语言基础下载

    线程中断/恢复的几种方式 178 创建线程的两种方式 179 线程的控制 180 实例分析 182 内容总结 189 独立实践 190 第十二章:高级I/O流 192 学习目标 192 I/O基础知识 193 字节流 193 字符流 194 节点流 194 过程流 ...

    Java 基础核心总结 +经典算法大全.rar

    关于 null 的几种处理方式大小写敏感 null 是任何引用类型的初始值 null 只是-种特殊的值使用 Null-Safe 方法null 判断 关于思维导图 Java.IO Java.lang Java.math Java.net Java 基础核心总结 V2.0 IO 传统的 ...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    其它对象对它的访问,访问权限所以有以下几种:private, protected, public, friendly。 1.8.2 对象 把类实例化,我们可以生成多个对象,这些对象通过消息传递来进行交互(消息 传递即激活指定的某个对象的方法以改变...

    java开源包11

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

Global site tag (gtag.js) - Google Analytics