`

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创建数组的几种方式总结

    Java创建数组的方式主要涵盖了一维数组的声明、创建和初始化,这是编程中基本的数据结构操作。下面我们将详细探讨这些知识点。 1. **一维数组的声明** 在Java中,声明数组有两种方式: - `type[] arrayName;` ...

    探讨Java的对象是怎么在内存中产生的?

    Java对象是由类实例化的结果,当我们使用`new`关键字创建一个对象时,实际上经历了以下几个步骤: 1. **类加载检查**:虚拟机首先检查`new`指令的参数是否能在常量池中定位到一个类的符号引用。如果该类尚未被加载...

    java 创建线程的几种方式

    总结来说,虽然两种方式都能创建线程,但实现Runnable接口通常更受欢迎,因为它更灵活,且可以避免由于单继承带来的问题。在实际开发中,根据项目需求和代码设计选择合适的方法。同时,理解线程的并发执行机制,正确...

    Java面向对象复习题目

    在Java中,类是创建对象的模板或蓝图,它定义了一组属性(数据成员)和方法(函数)。而对象则是类的实例,它拥有类所定义的属性和方法。例如,我们可以定义一个名为“Person”的类,包含姓名、年龄属性和说话的方法...

    JAVA单例模式的几种实现方法

    ### JAVA单例模式的几种实现方法 #### 一、饿汉式单例类 饿汉式单例类是在类初始化时就已经完成了实例化的操作。这种实现方式简单且线程安全,因为实例化过程是在编译期间完成的,不会受到多线程的影响。 **代码...

    计算java对象大小

    在Java中,对象的大小通常可以通过以下几种方式来计算: 1. **使用Java API**:Java 9及以上版本引入了一个名为`sun.misc.Unsafe`的API,虽然它不是公开的,但可以通过反射访问。`Unsafe`类提供了一个`...

    三种方式实现java远程调用(rmi),绝对可用

    在提供的压缩包文件中,"三种方式(原始方式_spring_jndi)实现java远程调用(rmi)"包含了相关的示例代码,帮助开发者理解并实践这三种RMI实现方法。在MyEclipse或其他Java开发环境中导入这些代码,可以进行调试和...

    9.java学习第九章——对象的创建和使用+构造方法+方法重载——作业的形式:创建对象在JVM中的存储状态(内存图).pdf

    - 在Java中,**创建对象**是使用类的模板来实例化一个具体的实例的过程。 - **创建对象**通常通过`new`关键字实现,例如: ```java Student student = new Student(); ``` - **对象**在内存中的存储状态分为两个...

    java面向对象练习题-经典

    Java面向对象练习题经典 Java面向对象练习题是Java编程语言中非常重要的一... 这个Java程序中定义了一个名为abc的类,该类中有一个main方法,该方法创建了一个名为AB的对象,并将其初始化为"Hello!"和"I love JAVA."。

    java实例化对象的过程

    工厂方法是一种设计模式,它提供了一种创建对象的抽象,允许子类改变实例化过程。单例模式确保一个类只有一个实例,并提供全局访问点。 总的来说,Java实例化对象是编程中的基本操作,它涉及到类的构造,内存分配,...

    java对象复制克隆

    标题中的“java对象复制克隆”主要涉及的是深拷贝,这是一种创建一个新对象的方式,新对象不仅复制了原对象的所有属性,还复制了嵌套的对象引用,使得修改复制后的对象不会影响到原始对象。 **浅拷贝**:在浅拷贝中...

    Java创建对象的几种方法

    这里我们将探讨三种常见的Java创建对象的方法:使用`new`关键字、使用`Object.clone()`以及通过反序列化。 1. **使用`new`关键字创建对象** 这是最常见也是最直接的方法。当类的实例需要被创建时,我们可以通过`...

    JAVA面向对象程序设计(期末考试试题及答案).zip

    在Java编程语言中,面向对象程序设计(Object-Oriented Programming, OOP)是一种核心的编程范式,它基于“对象”概念,将数据和处理数据的方法封装在一起,以实现代码的模块化和可重用性。这个压缩包文件"JAVA面向...

    Java面向对象程序设计本科课程详细ppt

    11. **反射机制**:反射是Java提供的一种强大的工具,可以在运行时检查类、接口、字段和方法的信息,并能动态地创建对象和调用方法。 12. **注解(Annotation)**:注解提供了一种安全的方式,向编译器或JVM提供元...

    java面向对象案例源码及PPT

    2. 类和对象:如何定义类,创建对象,以及成员变量和成员方法的使用。 3. 构造函数:用于初始化新创建的对象,理解无参构造和带参构造的使用场景。 4. 继承:展示如何使用extends关键字实现类的继承,以及super...

    Java设计模式之创建型模式的几个小DEMO

    本篇文章将详细探讨Java中的几种创建型设计模式,并通过具体的DEMO来阐述它们的应用。 1. 单例模式(Singleton): 单例模式确保一个类只有一个实例,并提供全局访问点。在Java中,可以通过懒汉式(线程不安全)、...

    Java对象池实现源码

    在这个例子中,我们定义了一个泛型对象池,通过`ObjectFactory`接口来创建对象。`borrowObject`方法负责从池中取出一个对象,`returnObject`方法则将对象放回池中。为了保证线程安全,这里使用了`synchronized`...

Global site tag (gtag.js) - Google Analytics