博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中是构造器创建对象吗?
阅读量:7047 次
发布时间:2019-06-28

本文共 4180 字,大约阅读时间需要 13 分钟。

首先,这里说明” Java中是构造器创建对象 “这句话是完全错误的。

Java中构造器的作用主要是为了初始化变量的值...其实在执行构造器之前,Java对象所需要的内存空间,已经产生了...

一般可以理解为由new关键字创建出来的哦。

在某些时候,一般通过new 关键字创建出相应的对象后,可以通过对应的构造方法来初始化对应变量的值。

但在某些特殊情况下,我们可以不通过new关键字而创建出相关的对象

常见的两种不通过new 关键字创建对象的方式如下:

1)通过Java的序列化和反序列化,来创建相关的对象...

2)通过Java的clone来创建相关的对象...

下面将分别讲解创建对象的这两种方式:

1)通过Java序列化的方式来创建Java对象

 具体例子如下:

 

package com.yonyou.test;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;/** * 测试类 * @author 小浩 * @创建日期 2015-3-2 */public class Test{   public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {   Wolf wolf_old=new Wolf();   Wolf wolf_new=null;   //创建对象输出流   ObjectOutputStream outStream=new ObjectOutputStream(new FileOutputStream("a.txt"));   ObjectInputStream  inputStream=new ObjectInputStream(new FileInputStream("a.txt"));   outStream.writeObject(wolf_old);   wolf_new=(Wolf) inputStream.readObject();   System.out.println(Wolf.count);   System.out.println("wolf_old和wolf_new相等吗?"+(wolf_old==wolf_new));  }   }/** * 创建狼这个测试对象 * @author 小浩 * @创建日期 2015-3-19 */class Wolf implements Serializable{	private static final long serialVersionUID = 1L;	static int count=100;	public Wolf(){		count-=10;		System.out.println("您好,我们正在执行构造方法...");		System.out.println(count);	}	}

 

  需要注意的是在使用java的序列化和反序列化的时候要使对应的实体类实现Serializable序列化接口哦...

      同时需要注意的是通过IO流实现反序列化的过程创建的对象的内容与原对象时完全一致的,但是它们却是不同的对象...

      同时通过序列化和反序列化创建的对象不会调用原来对象的构造方法...

      同时也提醒了我们,其实我们可以通过“ 私有的构造方法来实现单例模式 ”这种方式有可能是不安全的(为什么呢?)...

      如果要想在反序列化的过程中不会产生多个java对象实例,则应该为单例类提供readResolve()方法,该方法保证

      在反序列化的过程中得到已有的java实例...

      具体例子如下:

     

package com.yonyou.test;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;/** * 测试类 * @author 小浩 * @创建日期 2015-3-2 */public class Test{   public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {   Wolf wolf_old=Wolf.getWolf();   Wolf wolf_new=null;   //创建对象输出流   ObjectOutputStream outStream=new ObjectOutputStream(new FileOutputStream("a.txt"));   ObjectInputStream  inputStream=new ObjectInputStream(new FileInputStream("a.txt"));   outStream.writeObject(wolf_old);   wolf_new=(Wolf) inputStream.readObject();   System.out.println(Wolf.count);   System.out.println("wolf_old和wolf_new相等吗?"+(wolf_old==wolf_new));  }   }/** * 创建狼这个测试对象 * @author 小浩 * @创建日期 2015-3-19 */class Wolf implements Serializable{	private static final long serialVersionUID = 1L; 	static int count=100;	static Wolf wolf=null;	private Wolf(){		count-=10;		System.out.println("您好,我们正在执行构造方法...");		System.out.println(count);	}		public static Wolf getWolf(){		if(wolf==null)		{			wolf=new Wolf();		}		return wolf;	}		/**	 * 在反序列化的过程为实现单一实例而构建的方法	 */	private Object  readResolve(){		return wolf;	}	}

     

    

 2)通过Java的clone来创建相关的对象...

   首选被克隆的对象需要实现克隆接口:Clonable

   其次被克隆的对象需要重写clone方法

    具体例子如下:

   

package com.yonyou.test;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;/** * 测试类 * @author 小浩 * @创建日期 2015-3-2 */public class Test{   public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {   Wolf wolf_old=new Wolf();   //克隆相应的对象,并将其赋给新的对象   Wolf wolf_new=(Wolf) wolf_old.clone();   System.out.println(Wolf.count);   System.out.println("wolf_old和wolf_new相等吗?"+(wolf_old==wolf_new));  }   }/** * 创建狼这个测试对象 * @author 小浩 * @创建日期 2015-3-19 */class Wolf implements Cloneable{	static int count=100;	static Wolf wolf=null;	public Wolf(){		count-=10;		System.out.println("您好,我们正在执行构造方法...");		System.out.println(count);	}		/**	 * 实现克隆接口的时候需要重写的方法,但不是必须的	 */	public Object clone(){		Wolf wolf=null;		try {			wolf=(Wolf) super.clone();		} catch (CloneNotSupportedException e) {			e.printStackTrace();		}		return wolf;	}			}

          同样的道理,克隆后的两个对象为两个不同的对象哦...

     

          好吧,今天就先到这里吧~~~

  

 

    

      

 

 

 

 

转载地址:http://blzol.baihongyu.com/

你可能感兴趣的文章
BlockingQueue与Condition原理解析
查看>>
Nginx安全优化
查看>>
DilatedNet - 扩张卷积(语义分割)
查看>>
强化学习基础-对偶梯度上升
查看>>
设计模式——单例模式
查看>>
5G不是原子弹,任正非感谢美国帮忙宣传华为
查看>>
C++面向对象高级编程(上) 第二周 侯捷
查看>>
Spring Cloud Greenwich 新特性和F升级分享
查看>>
发现可远程控制玩家电脑的Steam漏洞,Valve 7500美元奖励上报人 ...
查看>>
0110-如何给Kerberos环境下的CDH集群添加Gateway节点
查看>>
正火的 Spring Boot 2.0 更新了啥?
查看>>
Kubernetes(K8s)Events介绍(上)
查看>>
Apsara SA系列混合云存储阵列发布
查看>>
携新一代车规级固态激光雷达而来,速腾聚创为助力自动驾驶量产有何新动作?...
查看>>
RStudio: Warning message: Setting LC_CTYPE failed, using "C" 浅析
查看>>
VDSM command failed: The method does not exist / is not available.
查看>>
Netflix Media Database - 起源和数据模型
查看>>
oracle查看执行计划
查看>>
深度强化学习从入门到大师:通过Q学习进行强化学习(第二部分)
查看>>
iptables快速记忆总结
查看>>