Java中是构造器创建对象吗?
首先,这里说明” 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;
} }
同样的道理,克隆后的两个对象为两个不同的对象哦...
好吧,今天就先到这里吧~~~
Java中是构造器创建对象吗?的更多相关文章
- 一文了解 Java 中的构造器
摘要:Java 也采用了构造器,并且还提供了一个垃圾收集器(garbage collector),当不再使用内存资源的时候,垃圾收集器会自动将其释放. 本文分享自华为云社区<一文带你了解 Jav ...
- Java中的构造器与垃圾回收
构造器 在我们初始化对象时,如果希望设置一些默认值,那么就可以使用构造器,在Java中,构造器使用和类同名的名字且没有返回值,如下 class Test{ private String name; T ...
- java中的构造器
构造器是什么 1.构造器,也称构造方法.构造函数.作用是构造出来一个类的实例,确保对象得到初始化. 2.构造器的格式: 权限修饰符 类名(无参/有参){}. 3.根据有无参数,可分为无参构造 和有参构 ...
- 转 java中5种创建对象的方法
作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...
- Java中初始化的相关问题
目录 局部变量的初始化 成员变量的初始化 构造器初始化 静态数据的初始化 总结 已经快半个月没写博客了,这周在看 Thinking in Java 这本书,准备将书中的第五章和第七章的内容整合一下,写 ...
- 第一弹:Java 中创建对象的4种方式
Java 是面向对象的语言,不可避免的,"对象"这个概念是 Java 语言的核心部分,这里来简单讨论一下在 Java 中创建一般对象的方法. 总结下来有以下4种创建对象的方法: 使 ...
- Java中创建对象的几种方式
Java中创建对象的五种方式: 作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:Spring去创建对象,然而这里有很多创建对象的方法:使用New关键字.使用Cl ...
- Java中创建对象的五种方式
我们总是讨论没有对象就去new一个对象,创建对象的方式在我这里变成了根深蒂固的new方式创建,但是其实创建对象的方式还是有很多种的,不单单有new方式创建对象,还有使用反射机制创建对象,使用clone ...
- Java中不通过构造方法创建对象的方法总结
我们常说,Java是一种面向对象的语言,因而在Java中几乎所有的操作都离不开对象.而在Java语言中,最常见的创建对象的方法是通过对类构造器的调用,除此之外,其实还有下面几种可以创建对象的方法. 1 ...
随机推荐
- Android UI Design
Ref:直接拿来用!10款实用Android UI工具 Ref:Android UI设计资源 Ref:Android酷炫实用的开源框架(UI框架) Ref:Android UI 组件 Ref:Andr ...
- Vue-cli创建项目从单页面到多页面3-关于将打包后的项目文件不放在根目录下
关于将打包后的项目文件不放在根目录下 有时候,我们总是需要这样的设置:希望将打包后的文件放在a.b.com/somepath/这样一个路径下. 然而在vue-cli创建的项目中,默认的打包路径中的静态 ...
- [转] 携程App网络服务通道治理和性能优化@2016
App网络服务的高可靠和低延迟对于无线业务稳定发展至关重要,过去两年来我们一直在持续优化App网络服务的性能,到今年Q2结束时基本完成了App网络服务通道治理和性能优化的阶段性目标,特此撰文总结其中的 ...
- 《程序员代码面试指南》第三章 二叉树问题 判断t1 树中是否有与t2 树拓扑结构完全相同的子树
题目 判断t1 树中是否有与t2 树拓扑结构完全相同的子树 java代码 package com.lizhouwei.chapter3; /** * @Description: 判断t1 树中是否有与 ...
- CSS3滑块菜单
在线演示 本地下载
- jquery 初篇
一.什么是jQuery对象? jQuery 对象就是通过jQuery包装DOM对象后产生的对象. jQuery 对象是 jQuery 独有的. 如果一个对象是 jQuery 对象, 那么它就可以使用 ...
- 【转】Struts2的线程安全 和Struts2中的设计模式----ThreadLocal模式
[转]Struts2的线程安全 和Struts2中的设计模式----ThreadLocal模式 博客分类: 企业应用面临的问题 java并发编程 Struts2的线程安全ThreadLocal模式St ...
- JSP<jsp:forward>与<%@ include%>
JSP<jsp:forward>与<%@ include%><jsp:include> <jsp:forward file="forwardTo_p ...
- springmvc对象映射个数超过256个
/** 由于Spring在接受前台传入的List时,就会出现256的IndexOutOfBoundsException异常 设置setAutoGrowCollectionLimit为1024 @par ...
- 查询速度优化用not EXISTS 代替 not in
1,not in 速度奇慢,要用 not EXISTS ,速度奇快! 大表效果尤其明显 sql中exists,not exists的用法 exists()后面的子查询被称做相关子查询,他是不返回列表的 ...