java中创建对象的四种方式

1.new出一个对象

String s = new String(“abc”);

2.利用反射创建对象

利用反射的两种方式:

  1. 使用Class对象的newInstance()方法来创建Class对象对应类的实例。但是这种方法要求Class对象的对应类有默认构造器,而执行newInstance()方法时实际上利用默认构造器来创建该类的实例。
  2. 先使用Class对象获取指定的Constructor对象,在调用Construtor对象的newInstance()方法来创建该Class类对应类的实例,通过这种方式可以选择使用某个类的指定构造器来创建实例,有三步:
    (1)获取Class对象
    (2)利用Class对象的getConstrutor方法来获取指定的构造器
    (3)调用Construtor的newInstance方法来创建java对象。

3.利用clone创建对象

  1. Clone和Copy
  • Copy,copy后的cindyelf与tobby指向内存的同一个object。
Employee cindyelf=tobby;
  • Clone,得到tobby的精确拷贝,且两者相互不影响,这时会得到一个新的Employee对象,且与tobby有相同的属性值和方法。
Employee cindy=tobby.clone()
  1. Shallow Clone和Deep Clone
  • Shallow Clone
    Shallow Clone是某个对象实施Clone后简单执行域对域的copy,但是如果一个employee里的一个域hireDay不是基本类型变量,而是引用类型,经过Clone后,它与原始的域所指向的对象是同一个对象,这样的Clone会与原始类共享一个信息,显然是不利的
  • Deep Clone
    Deep Clone就是解决了Shallow Clone的问题,对那些特殊的域做特殊处理。重新定义Clone方法,对hireDay做特殊处理。
class Employee implements Cloneable  {  public Object clone() throws CloneNotSupportedException  {  Employee cloned = (Employee) super.clone();  cloned.hireDay = (Date) hireDay.clone()  return cloned;  }  
} 
  1. Clone的保护机制
    在Object中Clone被声明为protected的,这样可以保证Clone的对象只能在本类里克隆。
  2. Clone()的使用方法
  3. 使用shallow clone 和 deep clone看对象的域是基本类型还是引用类型
  4. 调用clone方法时的对象所属类必须implements(继承)Cloneable接口,否则调用clone方法时抛出CloneNotSupportedException

4.利用反序列化创建对象

  1. 为什么要序列化
    关于java对象的生命周期,从创建到被堆的垃圾回不定期收回收,导致我们想再次访问访问不到,想要保存对象状态的话通过文件,数据库,序列化来完成。
    在远程访问方法调用RMI也会用到,在网络中传输对象,必须对对象序列化。
  2. 序列化
    设置三个属性
public class Person implements Serializable {  
int age;  
int height;
String name;
...
}
/** * Java对象的序列化与反序列化 */  
public static void main(String[] args) {  
Person zhangsan = new Person("zhangsan", 30, 170);  
Person lisi = new Person("lisi", 35, 175);  
Person wangwu = new Person("wangwu", 28, 178);  
try {  
//需要一个文件输出流和对象输出流;文件输出流用于将字节输出到文件,对象输出流用于将对象输出为字节  
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.ser"));  
out.writeObject(zhangsan);  
out.writeObject(lisi);  
out.writeObject(wangwu);  
out.close();  
} catch (IOException e) {  
e.printStackTrace();  
}  
} 

设置 序列化时需要实现Serializable,从javaAOP中我们可以看到这个接口为空接口,该接口没有声明任何方法
这里主要涉及到javaI/O流方面知识,主要用到FileOutPutString和ObjectOutPutString,FileOutPutString主要将字节输出到文件,ObjectOutPutString通过调用writeObject方法将对象变可以写出到流的数据,所以整个流程是这样的: ObjectOutputStream 将要序列化的对象转换为某种数据,然后通过 FileOutputStream 连接某磁盘文件,再对象转化的数据转化为字节数据再将其写出到磁盘文件。
3. 反序列化

public class MyTestSer {  
/** * Java对象的序列化与反序列化 */  
public static void main(String[] args) {  
Person zhangsan = new Person("zhangsan", 30, 170);  
Person lisi = new Person("lisi", 35, 175);  
Person wangwu = new Person("wangwu", 28, 178);  
try {  
//需要一个文件输出流和对象输出流;文件输出流用于将字节输出到文件,对象输出流用于将对象输出为字节  
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.ser"));  
out.writeObject(zhangsan);  
out.writeObject(lisi);  
out.writeObject(wangwu);  
} catch (IOException e) {  
e.printStackTrace();  
}  
try {  
ObjectInputStream in = new ObjectInputStream(new FileInputStream("person.ser"));  
Person one = (Person) in.readObject();  
Person two = (Person) in.readObject();  
Person three = (Person) in.readObject();  
System.out.println("name:"+one.name + " age:"+one.age + " height:"+one.height);  
System.out.println("name:"+two.name + " age:"+two.age + " height:"+two.height);  
System.out.println("name:"+three.name + " age:"+three.age + " height:"+three.height);  
} catch (Exception e) {  
e.printStackTrace();  
}  
}  
}  

我们存储的目的主要是为了再恢复使用,主要用到的流是FileInputstream和ObjectInputstream正好与存储时用到的流相对应。另外从结果顺序我们可以看到反序列化后得到对象的顺序与序列化时的顺序一致。
5. 总结

  • 进行对象序列化主要目的是为了保存对象的状态(成员变量)。
  • 进行序列化主要用到的流是FileOutputStream和ObjectOutputStream。FileOutputStream主要用于连接磁盘文件,并把字节写出到该磁盘文件;ObjectOutputStream主要用于将对象写出为可转化为字节的数据。
  • 要将某类的对象序列化,则该类必须实现Serializable接口,该接口仅是一个标志,告诉JVM该类的对象可以被序列化。如果某类未实现Serializable接口,则该类对象不能实现序列化。
  • 保存状态的目的就是为了在未来的某个时候再恢复保存的内容,这可以通过反序列化来实现。对象的反序列化过程与序列化正好相反,主要用到的两个流是FileInputstream和ObjectInputStream。
  • 反序列化后得到的对象的顺序与保存时的顺序一致
    补充:
    要保存的成员变量要么是基本类型的要么是String类型的。但有时成员变量有可能是引用类型的,这是的情况会复杂一点。那就是当要对某对象进行序列化时,该对象中的引用变量所引用的对象也会被同时序列化,并且该对象中如果也有引用变量的话则该对象也将被序列化。总结说来就是在序列化的时候,对象中的所有引用变量所对应的对象将会被同时序列化。这意味着,引用变量类型也都要实现Serializable接口。当然其他对象的序列化都是自动进行的。所以我们只要保证里面的引用类型是都实现Serializable接口就行了,如果没有的话,会在编译时抛出异常。如果序列化的对象中包含没有实现Serializable的成员变量的话,这时可以使用transient关键字,让序列化的时候跳过该成员变量。使用关键字transient可以让你在序列化的时候自动跳过transient所修饰的成员变量,在反序列化时这些变量会恢复到默认值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/21128.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

非对称密钥:应用场景

public class EncryptionAndSignatureExample { public static void main(String[] args) throws Exception {// 生成公私钥对KeyPairGenerator keyPairGenerator KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(1024);KeyPair keyPair keyPai…

路由策略实验2

对R7,重发布直连路由 对R2,做双向 对R3同样 先不改优先级 查看,知道所有给R3的路由为151,全部为OSPF。 知道了是错误的,先把3,4之间的线路断掉 接着对R3,让优先级全部回到100(displa…

node-sass和sass-loader安装Error经验

一、问题 当前笔记本环境版本:node-v16.15.1;npm-8.11.0,在面对五年前vue项目的依赖sass-loader8.0.2,node-sass4.14.1的情况下,怎么参考大神们的安装教程,始终存在Error,经过坚持不懈的努力&a…

微软云计算之云计算平台、云操作系统Windows Azure

微软云计算平台 微软云计算平台微软的云计算技术Windows Azure组成 微软云操作系统Windows AzureWindows Azure概述Windows Azure计算服务Windows Azure存储服务全局命名空间体系架构存储域的层次结构双复制引擎文件流层分区层 Windows Azure ConnectWindows Azure CDNFabric控…

十_信号11 - 函数sigsetjmp() 和 siglongjmp()

也就是说,正常情况下,当捕捉到一个信号,并调用该信号的信号处理程序时,被捕捉的信号会被加入到当前进程的信号屏蔽字中,以防止在本次信号处理程序还没有完成的时候,再次触发该信号, 发生重入。 …

LLaMA-Factory实战推理

LLaMA-Factory官网:https://github.com/hiyouga/LLaMA-Factory 安装环境 git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory/ conda create -n py310 python3.10 conda activate py310按照llama-factory要求的标准格式组织数据集&#xff…

网络原理——http/https ---http(2)

http(接上一篇文章) 认识请求报头"header" header里面的键值对,都是标准规定的内容,很多,我们主要是认识一些关键的 host 表示对应的服务器主机的IP / 域名 实际上,这两个通常来说是一样的 但是有些时候不一样 当我们通过代码构造http请求,url里面写的以Ip地址的…

6月2(信息差)

🌍特斯拉:Model3高性能版预计6月中旬开启首批交付 🎄微软对开源字体 Cascadia Code 进行重大更新 ✨天猫618加码引爆消费热潮 截至晚9点185个品牌成交破亿 1.瑞士清洁科技公司Librec开发废旧锂离子电池回收技术,可回收电池90%的…

Maven全局排除依赖用法

问题 项目中有很多依赖&#xff0c;某些Jar之间是有冲突的&#xff0c;有些冲突只有在运行时才会报出错误&#xff0c;这样就很危险。比如我使用如下方式去排除依赖。 <dependency><groupId>xxx</groupId><artifactId>xxx-web-common</artifactId…

Python函数式编程进阶:装饰器和闭包介绍

文章目录 Python函数式编程进阶&#xff1a;函数装饰器和闭包介绍一个简单的装饰器实现和行为表现装饰器通常会把函数替换成另一个函数Python导入模块时首先就会运行装饰器闭包__closure__属性可以查看闭包的自由变量总结 nonlocal声明 Python函数式编程进阶&#xff1a;函数装…

贴片和直插型IRM红外遥控接收头引脚定义和规格参数及使用注意事项

红外遥控接收头使用注意事项 引脚定义存在不同 红外遥控接收头大量使用在家用电器的遥控中&#xff0c;属于价廉物美的一种光电接收器件&#xff0c;批量价格约0.3元左右。 多数遥控接收头的引脚定义是OUT,GND,VCC&#xff0c;另有引脚定义不同为OUT,VCC,GND&#xff0c;记住…

Django 创建项目及应用

1&#xff0c;安装 Django pip install Django3.1.5 2&#xff0c;创建 Django项目 django-admin startproject myshop 3&#xff0c;创建 Django应用 python manage.py startapp app1 4&#xff0c;启动 Django项目 python .\manage.py runserver 到这里项目及应用创建…

Delphi主窗体实现透明

设置以下属性即可实现透明窗体显示文字&#xff1a; 设置窗体属性&#xff1a; BorderStyle 属性设置为 bsNone Color 属性设置为 clWhite&#xff08;白色&#xff1a;窗体背景色&#xff09; TransparentColor 属…

空间转录组基础数据解读+学习方法

详情请参考这个视频&#xff1a;空间转录组&#xff08;spatial transcriptome&#xff09;数据分析基础教程_哔哩哔哩_bilibili 1.首先是filtered_feature_bc_matrix文件 两个里面的内容本质一样&#xff0c;都是空间转录组 表达矩阵的信息 2.具体的所有东西可以在10x的网站…

React(五)UseEffect、UseRef

(一)useEffect useEffect – React 中文文档 useEffect hook用于模拟以前的class组件的生命周期&#xff0c;但比原本的生命周期有着更强大的功能 1.类组件的生命周期 在类组件编程时&#xff0c;网络请求&#xff0c;订阅等操作都是在生命周期中完成 import React, { Co…

图书推荐:ChatGPT专业知识信息课程

《ChatGPT专业知识信息课程》&#xff08;ChatGPT-Expertise Informative Course&#xff09; 是一本由Dwayne Anderson撰写的电子书&#xff0c;提供了关于ChatGPT的丰富知识。该书涵盖了与ChatGPT相关的各种主题&#xff0c;如其与OpenAI的关系、ChatGPT与GPT-3之间的混淆、C…

【蓝牙概述】

蓝牙无线技术是一种短距离通信系统&#xff0c;旨在取代连接便携式和/或固定电子设备的电缆。蓝牙无线技术的主要特点是稳健性、低功耗和低成本。该规范的许多功能都是可选的&#xff0c;从而允许产品差异化。 蓝牙无线技术系统有两种形式&#xff1a;基本速率 (BR) 和低功耗 …

浅谈旧项目如何添加新依赖

Spring项目创建之后&#xff0c;还想添加新的依赖&#xff08;如Spring框架内置的依赖&#xff09;&#xff0c;可以安装插件&#xff1a; 装完该插件之后&#xff0c;就可以在pom.xml文件里&#xff0c;右键选择 Generate即可出现下述界面&#xff1a; 点击ok即可添加新的…

jpeg压缩算法学习(1)——离散余弦变换

离散余弦变换是jpeg压缩算法的关键步骤 思想 离散余弦变换的基本原理是&#xff1a;每一组离散的数据都可以由一组不同频率的余弦波来表示。 应用于图片上就是&#xff1a;将像素值转换为不同频率的余弦函数的系数&#xff08;权重&#xff09; 像素值——>权重 一维离…

网络原理——TCP/IP--数据链路层,DNS

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 目录 数量链路层目的地址和原地址类型校验和 DNS 数量链路层 主要的协议是以太网协议.一个横跨数据链路层和 物理层的协议,既包含了数据链路层的内容, 也包含了⼀些物理层的内容 我们来了解一…