首先,这里说明” 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中是构造器创建对象吗?的更多相关文章

  1. 一文了解 Java 中的构造器

    摘要:Java 也采用了构造器,并且还提供了一个垃圾收集器(garbage collector),当不再使用内存资源的时候,垃圾收集器会自动将其释放. 本文分享自华为云社区<一文带你了解 Jav ...

  2. Java中的构造器与垃圾回收

    构造器 在我们初始化对象时,如果希望设置一些默认值,那么就可以使用构造器,在Java中,构造器使用和类同名的名字且没有返回值,如下 class Test{ private String name; T ...

  3. java中的构造器

    构造器是什么 1.构造器,也称构造方法.构造函数.作用是构造出来一个类的实例,确保对象得到初始化. 2.构造器的格式: 权限修饰符 类名(无参/有参){}. 3.根据有无参数,可分为无参构造 和有参构 ...

  4. 转 java中5种创建对象的方法

    作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...

  5. Java中初始化的相关问题

    目录 局部变量的初始化 成员变量的初始化 构造器初始化 静态数据的初始化 总结 已经快半个月没写博客了,这周在看 Thinking in Java 这本书,准备将书中的第五章和第七章的内容整合一下,写 ...

  6. 第一弹:Java 中创建对象的4种方式

    Java 是面向对象的语言,不可避免的,"对象"这个概念是 Java 语言的核心部分,这里来简单讨论一下在 Java 中创建一般对象的方法. 总结下来有以下4种创建对象的方法: 使 ...

  7. Java中创建对象的几种方式

    Java中创建对象的五种方式: 作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:Spring去创建对象,然而这里有很多创建对象的方法:使用New关键字.使用Cl ...

  8. Java中创建对象的五种方式

    我们总是讨论没有对象就去new一个对象,创建对象的方式在我这里变成了根深蒂固的new方式创建,但是其实创建对象的方式还是有很多种的,不单单有new方式创建对象,还有使用反射机制创建对象,使用clone ...

  9. Java中不通过构造方法创建对象的方法总结

    我们常说,Java是一种面向对象的语言,因而在Java中几乎所有的操作都离不开对象.而在Java语言中,最常见的创建对象的方法是通过对类构造器的调用,除此之外,其实还有下面几种可以创建对象的方法. 1 ...

随机推荐

  1. vue 计算属性和监听器

    一.计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div> {{ message.split('').rev ...

  2. 解决oracle锁表

    1.查看被锁住的表select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects ...

  3. json遍历

    $.each(item.attributes,function (name,value) { });

  4. BAPI LIST

    [转自 http://blog.csdn.net/minsenwu/article/details/8432081] 库存管理BAPI 库存: 1. BAPI_MATERIAL_AVAILABILIT ...

  5. 网络的分层协议总结(转发:https://www.cnblogs.com/Zhang-wj/p/5907534.html)

    网络的分层协议总结 OSI七层模型OSI 中的层            功能                                                        TCP/IP ...

  6. linux mount一个硬盘

    我们在使用linux的情况下,难免有时会需要增加一块硬盘,在windows下增加硬盘很简单,所有的操作都是有画面.linux下增加一块硬盘,并且让这块硬盘可以正常的使用,所有的操作都在字符命令行的方式 ...

  7. Android app与PC端交互

    app提交信息到PC端mysql数据库 新建名为SignActivity package com.example.administrator.success; import android.app.A ...

  8. eclipse 修改 JDK中的src.zip的路径

    http://blog.sina.com.cn/s/blog_54a1bca7010112fb.html http://www.douban.com/note/211369821/ 1.点 “wind ...

  9. weak 的内部实现原理

    问题 weak 变量在引用计数为0时,会被自动设置成 nil,这个特性是如何实现的? 答案 在 Friday QA 上,有一期专门介绍 weak 的实现原理.https://mikeash.com/p ...

  10. python3.7.1 内置函数

    python3.7.1 内置函数列表 内置函数 abs() delattr() hash() memoryview() set() all() dict() help() min() setattr( ...