面试Tip--java创建对象的四种方式

       java创建对象一共有四种方式,但是我们在写代码的时候用的new 关键字偏多,像一些接口对接则是序列化创建对象偏多,今天我们来简单介绍下使用场景以及各个方式

1. 使用 new 关键字

        这是最常见的创建对象的方式。

public class Example {private String message;public Example(String message) {this.message = message;}public String getMessage() {return message;}public static void main(String[] args) {Example example = new Example("Hello, World!");System.out.println(example.getMessage());}
}
2. 使用反射机制

        反射机制允许在运行时动态地创建对象、调用方法和访问字段。它通常用于框架和库中,提供高度的灵活性。

优点

  • 动态性:可以在运行时加载和使用类,而无需在编译时知道具体的类。
  • 灵活性:可以动态调用类的方法和访问字段。

缺点

  • 性能开销:反射操作通常比直接调用慢。
  • 安全性:可能破坏封装性,访问私有字段和方法可能带来安全隐患。

使用场景

        ORM框架,SpringMVC使用@RequestBody这类的注解等等

示例

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;public class ReflectionExample {private String message;public ReflectionExample(String message) {this.message = message;}public String getMessage() {return message;}public static void main(String[] args) {try {Class<?> clazz = Class.forName("ReflectionExample");Constructor<?> constructor = clazz.getConstructor(String.class);Object instance = constructor.newInstance("Hello, Reflection!");Method getMessageMethod = clazz.getMethod("getMessage");String message = (String) getMessageMethod.invoke(instance);System.out.println("Message: " + message);Field messageField = clazz.getDeclaredField("message");messageField.setAccessible(true);messageField.set(instance, "New Message via Reflection");System.out.println("Updated Message: " + getMessageMethod.invoke(instance));} catch (Exception e) {e.printStackTrace();}}
}
3. 使用 clone() 方法

通过 clone() 方法可以创建一个对象的副本。需要实现 Cloneable 接口并重写 clone() 方法。

public class Example implements Cloneable {private String message;public Example(String message) {this.message = message;}public String getMessage() {return message;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}public static void main(String[] args) {try {Example original = new Example("Hello, World!");Example clone = (Example) original.clone();System.out.println(clone.getMessage());} catch (CloneNotSupportedException e) {e.printStackTrace();}}
}
4. 使用序列化与反序列化

        通过将对象序列化为字节流,然后再从字节流中反序列化,可以创建对象。这通常用于对象的持久化和传输。

优点

  • 持久化:可以将对象的状态保存到文件或数据库中。
  • 传输:支持在网络上传输对象。
  • 深度复制:通过序列化和反序列化可以实现对象的深度复制。

缺点

  • 性能开销:序列化和反序列化过程可能比较耗时。
  • 安全性:反序列化不可信数据可能带来安全风险。

使用场景

  • 调用接口:我们开发的时候调用第三方接口,从三方接口获取的比如body的返回值,获取到的是String类型的,要不就是我们一层一层拨数据,要不就是反序列化对象
  • 数据库对象存储: 假设我们有一条订单表,这是假设,哥们不是做电商行业的。这张表有一个订单状态,那么我们就可以有一个长字段用来存储他的关系,而不是挂一张外表进行了。这里只是举例

示例、

import java.io.*;public class SerializationExample implements Serializable {private static final long serialVersionUID = 1L;private String message;public SerializationExample(String message) {this.message = message;}public String getMessage() {return message;}public static void main(String[] args) {SerializationExample original = new SerializationExample("Hello, Serialization!");// 序列化try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.dat"))) {oos.writeObject(original);} catch (IOException e) {e.printStackTrace();}// 反序列化try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.dat"))) {SerializationExample deserialized = (SerializationExample) ois.readObject();System.out.println("Deserialized Message: " + deserialized.getMessage());} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}
 4.1使用 JSON 反序列化

通过 JSON 反序列化,可以将 JSON 数据转换为 Java 对象,常用的库有 Jackson 和 Gson。

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;public class User {private String name;private int age;private String email;// Getters and Setterspublic static void main(String[] args) {String jsonString = "{\"name\":\"John\",\"age\":30,\"email\":\"john@example.com\"}";ObjectMapper objectMapper = new ObjectMapper();try {User user = objectMapper.readValue(jsonString, User.class);System.out.println("Name: " + user.getName());System.out.println("Age: " + user.getAge());System.out.println("Email: " + user.getEmail());} catch (IOException e) {e.printStackTrace();}}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}
}

·通过上面的例子,这样我们在创建对象的时候就会更加清晰了

点个关注再走吧!!!

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

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

相关文章

【AIGC X UML 落地】通过多智能体实现自然语言绘制UML图

前天写了篇博文讲到用PlantUML来绘制C类图和流程图。后台有读者留言&#xff0c;问这步能否自动化生成&#xff0c;不想学习 PlantUML 语法。 我想了下&#xff0c;发现这事可行&#xff0c;确实可以做到通过自然语言的描述就能实现 UML图的绘制&#xff0c;昨天晚上加了个班到…

统信UOS SSH服务升级(ubuntu20)内网

服务器配置 系统信息 SSH版本 目标版本 openssh-server_8.2p1-4_arm64.deb 因为不通互联网&#xff0c;所以所有deb包需要手动下载&#xff08;可以连接互联网的可以自动忽略手动下载deb步骤&#xff0c;直接apt-get install xxx 即可&#xff09; 升级步骤 !!!deb下载方式…

在Jenkins 中使用 NVM 管理 Node.js 部署项目的自动化脚本

在Jenkins 中使用 NVM 管理 Node.js 部署项目的自动化脚本 人生旅途&#xff0c;总有人不断地走来&#xff0c;有人不断地离去。当新名字变成老名字&#xff0c;当老的名字渐渐模糊&#xff0c;又是一个故事的结束和另一个故事的开始。 在现代软件开发中&#xff0c;持续集成/持…

Windows11下Docker使用记录(五)

目录 准备1. WSL安装cuda container toolkit2. win11 Docker Desktop 设置3. WSL创建docker container并连接cuda4. container安装miniconda&#xff08;可选&#xff09; Docker容器可以从底层虚拟化&#xff0c;使我们能够在 不降级 CUDA驱动程序的情况下使用 任何版本的CU…

支付宝小众玩法 爱溜达的人不容错过

创建一个简单的程序来帮助用户管理他们的图片&#xff0c;例如筛选分辨率合适、尺寸适中的图片来准备上传&#xff0c;这是一个技术上合理且有益的方向。例如&#xff0c;一个Python脚本使用Pillow库来检查文件夹中图片的尺寸&#xff1a; from PIL import Image import os# 根…

可视化数据科学平台在信贷领域应用系列五:零代码可视化建模

信贷风控模型是金融机构风险管理的核心工具&#xff0c;在信贷风险管理工作中扮演着至关重要的角色。随着信贷市场的环境不断变化&#xff0c;信贷业务的风险日趋复杂化和隐蔽化&#xff0c;开发和应用准确高效的信贷风控模型显得尤为重要。信贷风险控制面临着越来越大的挑战和…

【MySQL数据库】:MySQL内外连接

目录 内外连接和多表查询的区别 内连接 外连接 左外连接 右外连接 简单案例 内外连接和多表查询的区别 在 MySQL 中&#xff0c;内连接是多表查询的一种方式&#xff0c;但多表查询包含的范围更广泛。外连接也是多表查询的一种具体形式&#xff0c;而多表查询是一个更…

React-生成随机数和日期格式化

生成随机数 uuid文档&#xff1a;https://github.com/uuidjs/uuid npm install uuid import {v4 as uuidV4} from uuid 使用&#xff1a; uuidV4() 日期格式化 dayjs文档&#xff1a;安装 | Day.js中文网 npm install dayjs import dayjs from dayjs

LCTF 2018 bestphp‘s revenge

考点:Soap原生类Session反序列化CRLF注入 <?php highlight_file(__FILE__); $b implode; call_user_func($_GET[f], $_POST); session_start(); if (isset($_GET[name])) { $_SESSION[name] $_GET[name]; } var_dump($_SESSION); $a array(reset($_…

MySQL学习——选项文件的使用

MySQL 的许多程序都可以从选项文件&#xff08;有时也被称为配置文件&#xff09;中读取启动选项。选项文件提供了一种方便的方式来指定常用的选项&#xff0c;这样你就不必每次运行程序时都在命令行上输入这些选项。 要确定一个程序是否读取选项文件&#xff0c;你可以使用 -…

vim编辑器的使用

vim编辑器 1 vim编辑器三种常见模式2 命令模式2.1 移动光标的操作2.2 对数据操作2.3 查找函数 3 底行模式3.1 不退出vim进行操作3.2 与文件进行对比 4 vim的补充知识4.1 vim的批量化注释4.2 vim窗口的非正常关闭 5 vim的配置6 配置sudoer文件 1 vim编辑器三种常见模式 我们在编…

AMD显卡和英伟达显卡哪个好?

显卡是计算机中负责处理图形和视频输出的硬件设备&#xff0c;主要分为两种类型&#xff1a;AMD的A卡和NVIDIA的N卡。那么AMD显卡和英伟达显卡哪个好&#xff1f;怎么选&#xff1f; 答&#xff1a;不能一概而论地说哪个好&#xff0c;因为它们各有优势&#xff0c;选择应基于…

【Python报错】已解决ModuleNotFoundError: No module named ‘packaging’

成功解决“ModuleNotFoundError: No module named ‘packaging’”错误的全面指南 在Python编程中&#xff0c;遇到ModuleNotFoundError: No module named packaging这样的错误&#xff0c;通常意味着你的Python环境中缺少名为packaging的模块&#xff0c;或者该模块没有被正确…

Docker笔记-解决非交互式运行python时print不输出的问题

换句话来说就是在docker中如何不会python的print 只需要在启动时&#xff0c;不让python缓冲其输出。 关键命令如下&#xff1a;PYTHONUNBUFFERED1 如下&#xff1a; docker run -e PYTHONUNBUFFERED1 <your_image> 下面解释下-e "-e"选项的全称是"…

DDMA信号处理以及数据处理的流程---DDMA原理介绍

Hello&#xff0c;大家好&#xff0c;我是Xiaojie&#xff0c;好久不见&#xff0c;欢迎大家能够和Xiaojie一起学习毫米波雷达知识&#xff0c;Xiaojie准备连载一个系列的文章—DDMA信号处理以及数据处理的流程&#xff0c;本系列文章将从目标生成、信号仿真、测距、测速、cfar…

IT学习笔记--Flink

概况&#xff1a; Flink 是 Apache 基金会旗下的一个开源大数据处理框架。目前&#xff0c;Flink 已经成为各大公司大数据实时处理的发力重点&#xff0c;特别是国内以阿里为代表的一众互联网大厂都在全力投入&#xff0c;为 Flink 社区贡献了大量源码。 Apache Flink 是一个…

微信小程序uniapp的父子之间的通信传递

1.父传递给子信息 my-test是子组件 demo是父组件 这是定义在父组件中的的info信息 要将这个传递给子组件 子组件在properties 中接收父组件传递来的数据 msg type 是类型 value是默认值&#xff0c;当父组件没有传递数据时&#xff0c;就会默认使用value的数据 子组件…

JavaScript html css前端 日期对象 date对象 日期格式化 时间戳

日期对象 Date对象 Date 对象和 Math 对象不一样&#xff0c;他是一个构造函数&#xff0c;所以我们需要实例化后才能使用 Date 实例用来处理日期和时间 Date()使用方法 示例&#xff1a;获取当前时间 let now new Date() console.log(now) 示例&#xff1a;获取指定时间…

LabVIEW液压伺服压力机控制系统与控制频率选择

液压伺服压力机的控制频率是一个重要的参数&#xff0c;它直接影响系统的响应速度、稳定性和控制精度。具体选择的控制频率取决于多种因素&#xff0c;包括系统的动态特性、控制目标、硬件性能以及应用场景。以下是一些常见的指导原则和考量因素&#xff1a; 常见的控制频率范…

Vscode发生鼠标悬停正在加载、无法跳转和提示词的问题

Vscode发生鼠标悬停正在加载、无法跳转和提示词的问题 查看python语言服务器的日志&#xff0c;确定问题。 我的问题是加载的vscode 目录下存在一个很大的数据集目录&#xff0c;导致无法正常工作。 解决办法&#xff1a; 在vscode的pylance设置中&#xff0c;排除对应的目…