一:new运算的方式创建对象

public class Dog {String name;int age;public void show(){System.out.println("我叫"+this.name+"今年"+this.age+"岁了");}
}
Dog dog1=new Dog();
dog1.name="xiafeng";
dog1.age=3;

二:通过反射的方式创建对象

Java的反射技术是java程序的特征之一,它允许运行中的Java程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。
反射的作用:
1)可以通过反射机制发现对象的类型,找到类中包含的方法、属性和构造器
2)可以通过反射创建对象并访问任意对象方法和属性

第二种创建java对象的方式就是通过反射来创建了。
同上Dog类,首先JVM利用ClassLoader(类加载器)先将Dog类加载到内存,然后马上产生了一个Class类型的对象,该对象可以看成是一个模型,以后无论创建多少个Dog类的实例都是利用该模型来生成(一个类所对应的Class类型的对象只有一个)。

通过反射创建对象第一步:需要获得class对象

Class clazz = Dog.class;

这样获取到类对象之后就可以通过newInstance()这个方法来获取具体的对象了,需要注意的是这个方法的返回值是Object类型,我们需要进行转型操作

Class clazz = Dog.class;
Dog dog = (Dog)clazz.newInstance();

这样我们就通过反射的方式创建好了java对象,newInstance()和new的区别如下:
newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造。
在这里需要注意的是,newInstance()这个方法只能够调用无参的构造函数(其实这也符合javabean规范,一个类必须拥有一个无参构造函数),现在我们在Dog类中写有参构造函数(默认覆盖无参构造函数),值得注意的是,当我们写了有参构造函数之后,系统将不再提供默认的无参构造函数,如果需要的话,需要自己写

public class Dog {
String name;
int age;
public Dog(String name,int age){
this.name=name;
this.age=age;
}
}

现在再去调用newInstance()方法

Class clazz=Dog.class;
Dog dog=(Dog) clazz.newInstance();

现在程序运行结果为java.lang.InstantiationException,着就是程序没有无参构造函数而使用newInstance()方法引发的错误了

三:通过对象反序列化的方式来创建

当我们使用反序列化一个对象的时候,JVM会给我们创建一个对象。但是,反序列化的时候JVM并不会去调用类的构造函数(前边两种方式都会去调用构造函数)来创建对象,而是通过之前序列化对象的字节序列来创建的。

序列化对象必须实现Serializable这个接口
把对象转为字节序列的过程称为对象的序列化
把字节序列恢复为对象的过程称为对象的反序列化

public class Dog implements Serializable{
String name;
int age;
public void show(){
System.out.println("我叫"+this.name+"今年"+this.age+"岁了");
}
}

需要注意的是:Dog类需要实现Serializable这个接口才可以被序列化/反序列化,否则会出现java.io.NotSerializableException异常

对象序列化通常有两种用途:

1)将对象的字节序列永久的保存到硬盘上
例如web服务器把某些对象保存到硬盘让他们离开内存空间,节约内存,当需要的时候再从硬盘上取回到内存中使用
2)在网络上传递字节序列
当两个进程进行远程通讯的时候,发送方将java对象转换成字节序列发送(序列化),接受方再把这些字节序列转换成java对象(反序列化)

当Dog类实现了Serializable接口后,我们现在将Dog对象序列化

Dog dog=new Dog();
dog.name="xiafeng";
dog.age=3;
FileOutputStream fos = new FileOutputStream("dog.txt");
ObjectOutputStream ops = new ObjectOutputStream(fos);
ops.writeObject(dog);
System.out.println("dog对象序列化完成");

通过ObjectOutputStream的writeObject方法,我们就将一个对象完成了序列化

现在我们再次将刚才序列化后的对象反序列化回来,这次用到的是ObjectInputStream的readObject方法:

OutputStream fos=new FileOutputStream("dog.txt");
ObjectInputStream ois=new ObjectInputStream(fos);
Dog dog=(Dog) ois.readObject();
System.out.println("我叫"+dog.name+"今年"+dog.age+"岁了");
System.out.println("对象反序列化完成");

这样我们就使用了对象的序列化完成了java对象的创建

四:通过clone的方式来创建

clone方法来源于java中object类,在jdk中的解释为:该方法返回一个此对象的副本。clone顾名思义就是复制的意思。所谓复制对象就是在内存中分配一个和原来一模一样的空间,在此创建新的对象。

我们现在就来完成clone的实验,首先我们需要在需要clone的类中实现Cloneable接口,否则会出现java.lang.CloneNotSupportedException异常,由于Object类中clone方法是protected 修饰的,所以我们必须在需要克隆的类中重写克隆方法

public class Dog implements Cloneable{
String name;
int age;
@Override
protected Object clone() throws CloneNotSupportedException {
//TODO Auto-generated method stub
return super.clone();
}
}

现在进入实验1:

Dog d1=new Dog();
Dog d2=d1;
System.out.println(d1==d2);

返回值为true,因为在这个地方只有d1是真实创建了对象,d2来源于d1的赋值,引用地址值一样(代表是同一个对象),所以==判断结果为true

现在进入实验2:

Dog d1=new Dog();
Dog d2=(Dog) d1.clone();
System.out.println(d1==d2);

实验结果为false,因为clone是真实在内存中重新划分一块区域来存储新的对象,d1和d2是两个不同的对象所以返回结果值为false

这样我们就使用了对象的克隆的方式完成了java对象的创建

Java创建对象的四种方法相关推荐

  1. Java创建对象的四种方式

    1. new 2. clone 3. 通过反射newInstance 4. 反序列化 5. String s = "abc"(这个是比较特殊的) 以String类为例 String ...

  2. JAVA遍历list四种方法及其效率比较

    四种主要方法有: foreach for(Object ob : list){ } Iterator Iterator it = list.iterator(); while(it.hasNext() ...

  3. Java创建对象详解:Java创建对象的几种方法

    对象是对类的实例化.对象具有状态和行为,变量用来表明对象的状态,方法表明对象所具有的行为.Java 对象的生命周期包括创建.使用和清除,本文详细介绍对象的创建,在 Java 语言中创建对象分显式创建与 ...

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

    java是面向对象的,所以在使用中经常会去创建对象,而我们一般创建对象只会使用new关键字去创建,这里给大家总结一下在java中创建对象的5中方法: 使用new关键字 } → 调用了构造函数 使用Cl ...

  5. java 字符串 移位_使用位运算、值交换等方式反转java字符串-共四种方法

    在本文中,我们将向您展示几种在Java中将String类型的字符串字母倒序的几种方法. StringBuilder(str).reverse() char[]循环与值交换 byte循环与值交换 apa ...

  6. delphi64位 char数组转换string中文乱码_使用位运算、值交换等方式反转java字符串-共四种方法...

    在本文中,我们将向您展示几种在Java中将String类型的字符串字母倒序的几种方法. StringBuilder(str).reverse() char[]循环与值交换 byte循环与值交换 apa ...

  7. java 比大小(四种方法任选)

    题目描述编写一个程序,输入a.b.c三个值,输出其中最大值. 输入格式一行数组,分别为a b c 输出格式a b c其中最大的数 样例输入10 20 30 样例输出30 package com.lia ...

  8. js创建对象的四种方法

    1.利用new Object()创建对象 2. 字面量创建对象 3.工厂模式创建对象 4. 利用构造函数创建对象 <script>//利用new Object()创建对象var obj1 ...

  9. JavaSE(二十五)——String与StringBuffer、StringBuilder的区别、创建对象的几种方法、Http和Https的区别

    文章目录 1. String与StringBuffer.StringBuilder的区别 2. Java创建对象的几种方法 3. Http和Https的区别 1. String与StringBuffe ...

最新文章

  1. 深入理解PHP原理之变量作用域
  2. Juniper静态路由之no-advertise和qualified-next-hop
  3. CVPR 2019 | 无监督领域特定单图像去模糊
  4. MVC Controller与ActionResult的返回值
  5. moodle架构分析---表现层的设计(二)
  6. 怎么赚美金_我16岁时如何赚到200,000美元
  7. JavaScript实现MVVM之我就是想监测一个普通对象的变化
  8. mysql恢复某张表的数据_mysql恢复某张表
  9. 2010头号病毒追杀令——恶意下载者001
  10. 小样本学习与Triplet Loss,数据增强和课程学习
  11. Ubuntu开启nfs并连接开发板
  12. Android之apk优化
  13. C/C++中深浅拷贝(map、vector)与内存释放
  14. 千图成像!祝可爱的小伙伴们圣诞快乐
  15. 武汉大学2018计算机考研拟录取名单,【完整版】2018年武汉大学硕士研究生考试拟录取名单...
  16. 操作系统笔记 第一章
  17. 网站域名被墙(被封锁、被屏蔽、被和谐)后最好的解决方法
  18. zheng win 环境搭建
  19. 开源开放 | 面向家庭常见疾病的知识图谱(东南大学)
  20. [转]IDA + GDBServer实现iPhone程序远程调试

热门文章

  1. 学会用打码平台处理验证码
  2. UEFI和Legacy及UEFI+Legacy启动的区别
  3. 王半仙儿的日记-0002
  4. 【Win10系统安装】联想小新V3000安装Win10操作系统,并使用Administrator账户登录
  5. 联想微型计算机开机密码忘记了,lenovo台式电脑忘了开机密码简单解决的方法,小孩子就能搞定的...
  6. win7 台式机建热点
  7. ctfshow萌新计划web22
  8. 微信小程序 java springboot理发店美容店预约系统
  9. 基于Java毕业设计校园外卖系统Web端源码+系统+mysql+lw文档+部署软件
  10. eclipse中的javaEE插件