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;
	}

}

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

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

  

时间: 2024-10-03 06:48:59

Java中是构造器创建对象吗?的相关文章

Java中的构造器

Java中的构造器 Java在使用new创建对象时,会调用其构造器,构造器与方法不同,其没有返回值,且其名字与类名一致,在构造器中,我们可以初始化类的一些fields,这样,当我们创建好对象后,这些对象都有了默认的初始值 . 当我们的类在继承父类的时候,在创建子类对象的时候,首先会调用父类的构造器,实际上,父类的构造器在调用之前,会继续调用Object类的构造器,当Object类的构造器调用完成之后,才调用父类的构造器,依次在调用子类的构造器.这样做的原因是,我们的子类对象的fields的值可能

java中 构造器与void

在java中,构造器与void都没有返回值, java编程思想中这么解释构造器的: 构建器属于一种较特殊的方法类型,因为它没有返回值.这与 void 返回值存在着明显的区别.对于void 返回值,尽管方法本身不会自动返回什么,但仍然可以让它返回另一些东西.构建器则不同,它不仅什么也不会自动返回,而且根本不能有任何选择.若存在一个返回值,而且假设我们可以自行选择返回内容,那么编译器多少要知道如何对那个返回值作什么样的处理. 自己运行的例子: public class SimpleConstruct

Java读书笔记十二(Java中的代码块)

前言 我们知道在java中通过构造器来为对象进行初始化操作,但是在java中与构造器类似的还有初始化块的操作,下面小编来为大家分享一下. 初始化块使用 在Java中初始化块是java中出现的第4中成员,前三种分别是成员变量.方法和构造器.一个类中可以有多个初始化块,并且相同类型的初始化块是按照顺序依次执行的.初始化块的修饰符只能是static,初始化块可以包含任何可执行语句,包括定义局部变量.调用其他对象方法,以及使用分支.循环语句等 /** * @FileName: test.java * @

Java中创建对象的几种方式

Java中创建对象的五种方式: 作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:Spring去创建对象,然而这里有很多创建对象的方法:使用New关键字.使用Class类的newInstance方法.使用Constructor类的newInstance方法.使用Clone方法.使用反序列化. 使用new关键字:这是我们最常见的也是最简单的创建对象的方式,通过这种方式我们还可以调用任意的够赞函数(无参的和有参的).比如:Student student = ne

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

Java 是面向对象的语言,不可避免的,"对象"这个概念是 Java 语言的核心部分,这里来简单讨论一下在 Java 中创建一般对象的方法. 总结下来有以下4种创建对象的方法: 使用 new 关键字调用对象的构造器: 使用 Java 反射的 newInstance() 方法: 使用 Object 类的 clone() 方法: 使用对象流 ObjectInputStream 的 readObject() 方法读取序列化对象: 1.      使用 new 关键字 最常见的 Java 对象

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

我们常说,Java是一种面向对象的语言,因而在Java中几乎所有的操作都离不开对象.而在Java语言中,最常见的创建对象的方法是通过对类构造器的调用,除此之外,其实还有下面几种可以创建对象的方法. 1)通过反射机制来创建对象; class Person{ String name="Jack"; public Person(){ System.out.println("construct"); } public String toString(){return nam

Java中创建对象的五种方式

我们总是讨论没有对象就去new一个对象,创建对象的方式在我这里变成了根深蒂固的new方式创建,但是其实创建对象的方式还是有很多种的,不单单有new方式创建对象,还有使用反射机制创建对象,使用clone方法去创建对象,通过序列化和反序列化的方式去创建对象.这里就总结一下创建对象的几种方式,来好好学习一下java创建对象的方式. 一.使用new关键字 这是我们最常见的也是最简单的创建对象的方式,通过这种方式我们还可以调用任意的够赞函数(无参的和有参的). 比如:Student student = n

Java中创建对象的5种方式 &&new关键字和newInstance()方法的区别

转载:http://www.kuqin.com/shuoit/20160719/352659.html 用最简单的描述来区分new关键字和newInstance()方法的区别:newInstance: 弱类型.低效率.只能调用无参构造.new: 强类型.相对高效.能调用任何public构造. newInstance( )是一个方法,而new是一个关键字,其次,Class下的newInstance()的使用有局限,因为它生成对象只能调用无参的构造函数,而使用new关键字生成对象没有这个限制.Cla

JAVA中构造器和方法的区别点

要学习Java,你必须理解构造器.因为构造器可以提供许多特殊的方法,这个对于初学者经常混淆.但是,构造器和方法又有很多重要的区别. 下面将简单介绍一下 ,最后用一个表作了些简单的总结. 功能和作用的不同构造器是为了创建一个类的实例.这个过程也可以在创建一个对象的时候用到:Platypus p1 = new Platypus(); 相反,方法的作用是为了执行java代码. 修饰符,返回值和命名的不同构造器和方法在下面三个方便的区别:修饰符,返回值,命名.和方法一样,构造器可以有任何访问的修饰: p