Java中有几种创建对象的方式

1、直接使用new语句

调用类的构造器来实例化对象。

	public static void newCreate() {
		Person person = new Person("Jack"); // output: Create person[Jack]!
		System.out.println(person); // output: [email protected]
	}

2、利用反射机制

通过java.lang.Class或java.lang.reflect.Constructor的newInstance()方法来间接的调用构造器。

	public static void reflectCreate() throws Exception {
		Constructor<Person> cst = Person.class.getDeclaredConstructor(String.class);
		Person person = cst.newInstance("Jerry"); // output: Create person[Jerry]!
		System.out.println(person); // output: [email protected]
	}

3、克隆对象的方式

Object类里面有一个clone方法,重写这个方法实现克隆,记得类必须实现java.lang.Cloneable接口,否则会爆CloneNotSupportedException异常的。

	public static void cloneCreate() throws Exception {
		Person person = new Person("Bob"); // output: Create person[Bob]!
		System.out.println(person); // output: [email protected]
		Person clonePerson = (Person) person.clone();
		System.out.println(clonePerson + " " +
				clonePerson.getName()); // output: [email protected] Bob
	}

通过克隆获取对象并没有调用构造器,取得的对象还复制了原来对象的name值,Object里面的clone方法是个native方法,也就是本地代码实现的,直接复制了内存,这种复制是浅层的复制,对基本数据类型和String类型能够完全复制,但是对于其它复杂的引用类型复制的也只是个引用,通过克隆对象修改引用类型的值是会影响到原来对象的,如果要实现深拷贝则要稍微修改一下clone方法,具体需求具体分析。

4、反序列化对象

	public static void deserializeObject() throws Exception {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(baos);
		Person person = new Person("Marry"); // output: Create person[Marry]!
		System.out.println(person); // output: [email protected]
		oos.writeObject(person);
		oos.close();

		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
		ObjectInputStream ois = new ObjectInputStream(bais);
		Person serializedPerson = (Person) ois.readObject();
		System.out.println(serializedPerson + " " +
				serializedPerson.getName()); // output: [email protected] Marry
		ois.close();
	}

我们发现这种方式也没有调用构造器,同样还原了原来对象的name值。

时间: 2024-10-16 15:12:38

Java中有几种创建对象的方式的相关文章

Java中有两种实现多线程的方式以及两种方式之间的区别

网上流传很广的是一个网上售票系统讲解.转发过来.已经不知道原文到底是出自哪里了. Java中有两种实现多线程的方式.一是直接继承Thread类,二是实现Runnable接口.那么这两种实现多线程的方式在应用上有什么区别呢? 为了回答这个问题,我们可以通过编写一段代码来进行分析.我们用代码来模拟铁路售票系统,实现通过四个售票点发售某日某次列车的100张车票,一个售票点用一个线程表示. 我们首先这样编写这个程序: Java代码    class ThreadTest extends Thread{

Java中两种实现多线程方式的对比分析

本文转载自:http://www.linuxidc.com/Linux/2013-12/93690.htm#0-tsina-1-14812-397232819ff9a47a7b7e80a40613cfe1 Java中有两种实现多线程的方式.一是直接继承Thread类,二是实现Runnable接口.那么这两种实现多线程的方式在应用上有什么区别呢? 为了回答这个问题,我们可以通过编写一段代码来进行分析.我们用代码来模拟铁路售票系统,实现通过四个售票点发售某日某次列车的100张车票,一个售票点用一个线

javascript 中九种创建对象的方式

javascript 中对象的简介: ECMA-262 把对象的定义为:"无序属性的集合,其属性可以包含基本值,对象或者函数."严格来讲,这就相当于说对象是一组没有特定顺序的值.对象的每个属性或方法都有一个名字,而每个名字都映射到一个值.正是因为这样,我们可以把 javascript 中的对象想象成散列表:无非就是一组名值对,其中值可以是数据或函数. javascript 中九种创建对象的方式: 1.原生 Object 构造函数 2.对象字面量表示法 3.工厂模式 4.构造函数模式 5

javascript三种创建对象的方式

javascript是一种“基于prototype的面向对象语言“,与java有非常大的区别,无法通过类来创建对象.那么,既然是面象对象的,如何来创建对象呢? 一.通过”字面量“方式创建. 方法:将成员信息写到{}中,并赋值给一个变量,此时这个变量就是一个对象.例如:  var person = (name:'dongjc', work:function() {console.log('write coding')});   如果{}中为空,则将创建一个空对象:  var person = {}

java倒计时三种简单实现方式

写完js倒计时,突然想用java实现倒计时,写了三种实现方式 一:设置时长的倒计时: 二:设置时间戳的倒计时: 三:使用java.util.Timer类实现的时间戳倒计时 代码如下: 1 package timer; 2 3 import java.util.Calendar; 4 import java.util.Date; 5 import java.util.Timer; 6 import java.util.TimerTask; 7 8 /** 9 * java演示倒计时 10 * 11

js几种创建对象的方式

//1.0.1 定义js对象的方式1 function c01DefineObj1() { var obj = new Object(); obj.Name = "八戒"; obj.Age = 500; obj.Say = function () { //alert("Name=" + obj.Name + ", Age=" + obj.Age); alert("Name=" + this.Name + ", Age

【Java面试题】23 java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?

java5 以前, 有如下两种:第一种:new Thread(){}.start();这表示调用 Thread 子类对象的 run 方法, new Thread(){}表示一个Thread 的匿名子类的实例对象, 子类加上 run 方法后的代码如下: new Thread(){ public void run(){ } }.start(); 第二种:new Thread(new Runnable(){}).start();这表示调用 Thread 对象接受的 Runnable 对象的 run方法

java 中有几种方法可以实现一个线程? 用什么关键字修 饰同步方法? stop()和 suspend()方法为何不推荐使用?

java5 以前, 有如下两种:第一种:new Thread(){}.start();这表示调用 Thread 子类对象的 run 方法, new Thread(){}表示一个Thread 的匿名子类的实例对象, 子类加上 run 方法后的代码如下: 1 new Thread(){ 2 public void run(){ 3 } 4 }.start(); 第二种:new Thread(new Runnable(){}).start();这表示调用 Thread 对象接受的 Runnable 对

js中8种创建对象的方式

对象的定义为:"无序属性的集合,其属性可以包含基本值,对象或者函数"   1.创建单个对象(对象字面量,构造函数): <script type="text/javascript"> //通过创建phone实例为例子 //构造函数创建单个对象 // var phone=new Object(); // phone.color='black'; // phone.size=24; // phone.getColor=function(){ // consol