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 ...
随机推荐
- 获取exe文件窗口抓图,将memo转化为JPG输出
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...
- 使用oracle10g官方文档找到监听文件(listener.ora)的模板
***********************************************声明*************************************************** ...
- ABAP动态生成经典应用之Dynamic SQL Excute 程序
[转自http://blog.csdn.net/mysingle/article/details/678598]开发说明:在SAP的系统维护过程中,有时我们需要修改一些Table中的数据,可是很多Ta ...
- Apache Shiro 使用手册(一)Shiro架构介绍(转发:http://kdboy.iteye.com/blog/1154644#bc2399255)
一.什么是Shiro Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能: 认证 - 用户身份识别,常被称为用户“登录”: 授权 - 访问控制: 密码加密 ...
- activiti基础--2----------------------(流程定义)
Deployment 部署对象 1.一次部署的多个文件信息,对于不需要的流程可以删除和修改 2.对应的表 act_re_deployment #部署对象表 act_re_procdef #流程定义表 ...
- Windows存储管理之磁盘结构详解
Windows磁盘结构: Windows的主流磁盘结构分为MBR和GPT两种.MBR是早期Windows的唯一选择,但是随着物理磁盘的容量不断增大.GPT结构成为目前的主流,最大支持超过2TB的容量, ...
- 中国移动OnetNet云平台 使用WIFI模块ESP8266 TCP非透传模式传输数据流步骤
测试使用工具: WIFI模块型号:ESP8266 https://item.taobao.com/item.htm?spm=a1z10.1-c.w137712-175513579.2.btbD9X&a ...
- 帝国cms数据表中文说明
本文介绍下,帝国cms中各数据表的用途,有需要的朋友,参考下吧. 帝国cms各数据表及用途说明. phome_ecms_infoclass_news 新闻采集规则记录表 phome_ecms_info ...
- selenium之坑(StaleElementReferenceException: Message: Element not found in the cache...)
有时候循环点击一列链接,只能点到第一个,第二个就失败了 原因是第二个已经是新页面,当然找不到之前页面的元素.就算是后退回来的,页面也是不一样的 页面长的一样不一定是同一张页面,就像两个人长的一样不一定 ...
- 事务的四大特性ACID
ACID是指数据库事务的四大特性,是由Jim Gray在19世纪70年代后期提出的概念,1983年Andreas Reuter and Theo Härder创造了ACID这个缩略语用来描述这四大特性 ...