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 ...
随机推荐
- 遇到IIS configuration error错误的可以看看,不一定是权限问题
最近接手了别人的一个 DOT NET项目,编译.调试一切都OK(心里暗暗高兴),发布吧,结果放到服务器上一运行出现Configuration Error错误,提示:“Access to the pat ...
- LeetCode:汇总区间【228】
LeetCode:汇总区间[228] 题目描述 给定一个无重复元素的有序整数数组,返回数组区间范围的汇总. 示例 1: 输入: [0,1,2,4,5,7] 输出: ["0->2&quo ...
- iOS 基本数据类型 和 指针 特点
基本数据类型 : 整型int, 字符型char , 浮点型 (float 和 double), 枚举型; -- 构造类型 : 数组类型, 结构体类型, 共用体类型; -- 指针类型 : 最终要的数据类 ...
- m3u8格式转MP4
公司直播平台使用的是七牛直播,今天有客户表示想将直播回放视频下载下来,数据妹子犯了愁,表示这个不会下载给客户,于是乎这个任务就落在了我的头上.熟练的打开视频,在 HTML 源代码播放地址为 http: ...
- ubuntu配置jdk环境
简单记录如下: 1. 下载JDK并解压后,复制到想要放置的目录,本文以“/usr/lib/jdk”为例: 2. 编辑配置文件,可以是“/etc/profile”或者“~/.bashrc”. 输入命令“ ...
- 20165101刘天野 2018-2019-2《网络对抗技术》Exp8 Web基础
20165101刘天野 2018-2019-2<网络对抗技术>Exp8 Web基础 1.实验内容 1.1 Web前端HTML (1)输入命令service apache2 start启动A ...
- Quartz.Net在C#中的使用
概述 Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)来调度作业.它实现了 ...
- eclipse中集成velocity插件
1.打开eclipse,点击help,选择install new software 2.点击add,输入下载地址: http://download.eclipse.org/eclipse/update ...
- UOJ130 【NOI2015】荷马史诗
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- java读取pdf文档
import java.io.*;import org.pdfbox.pdmodel.PDDocument;import org.pdfbox.pdfparser.PDFParser;import o ...