高级java每日一道面试题-2024年11月18日-基本篇-Java创建对象有几种方法?

如果有遗漏,评论区告诉我进行补充

面试官: Java创建对象有几种方法?

我回答:

在 Java 中,创建对象有多种方法。以下是常见的几种方法及其详细解释:

1. 使用 new 关键字

这是最常见的创建对象的方法。通过调用类的构造方法来创建对象。

MyClass obj = new MyClass();

2. 使用反射(Reflection)

反射允许在运行时动态地创建对象。通过 Class 类的 newInstance 方法或 Constructor 类的 newInstance 方法来创建对象。

// 使用 Class.newInstance 方法
MyClass obj1 = MyClass.class.newInstance();// 使用 Constructor.newInstance 方法
Constructor<MyClass> constructor = MyClass.class.getConstructor();
MyClass obj2 = constructor.newInstance();try {Class<?> clazz = Class.forName("com.example.MyClass");MyClass obj = (MyClass) clazz.getDeclaredConstructor().newInstance();
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {e.printStackTrace();
}

3. 使用克隆(Clone)

通过实现 Cloneable 接口并重写 clone 方法,可以创建对象的副本。

public class MyClass implements Cloneable {@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}MyClass original = new MyClass();
MyClass clonedObj = (MyClass) original.clone();

4. 使用反序列化(Deserialization)

通过将对象序列化为字节流,然后再反序列化为对象,可以创建对象。

import java.io.*;public class MyClass implements Serializable {private static final long serialVersionUID = 1L;
}public class Main {public static void main(String[] args) throws IOException, ClassNotFoundException {MyClass original = new MyClass();// 序列化ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(original);oos.close();// 反序列化ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais);MyClass deserializedObj = (MyClass) ois.readObject();ois.close();}
}

5. 使用工厂方法(Factory Method)

通过工厂方法模式,可以在一个类中定义一个方法来创建对象,而不是直接使用 new 关键字。

public class MyClassFactory {public static MyClass createInstance() {return new MyClass();}
}MyClass obj = MyClassFactory.createInstance();

6. 使用单例模式(Singleton Pattern)

单例模式确保一个类只有一个实例,并提供一个全局访问点。

public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}Singleton obj = Singleton.getInstance();

7. 使用对象池(Object Pool)

对象池是一种设计模式,用于管理和重用对象,以减少创建和销毁对象的开销。

import java.util.concurrent.ConcurrentLinkedQueue;public class ObjectPool {private final ConcurrentLinkedQueue<MyClass> pool = new ConcurrentLinkedQueue<>();public MyClass getObject() {MyClass obj = pool.poll();if (obj == null) {obj = new MyClass();}return obj;}public void releaseObject(MyClass obj) {pool.offer(obj);}
}ObjectPool pool = new ObjectPool();
MyClass obj1 = pool.getObject();
// 使用 obj1
pool.releaseObject(obj1);

8. 使用构造器模式(Builder Pattern)

构造器模式用于创建复杂的对象,通过逐步构建对象的各个部分。

public class MyClass {private String field1;private int field2;private MyClass(Builder builder) {this.field1 = builder.field1;this.field2 = builder.field2;}public static class Builder {private String field1;private int field2;public Builder setField1(String field1) {this.field1 = field1;return this;}public Builder setField2(int field2) {this.field2 = field2;return this;}public MyClass build() {return new MyClass(this);}}
}MyClass obj = new MyClass.Builder().setField1("value1").setField2(123).build();

总结

以上是 Java 中创建对象的几种常见方法。每种方法都有其适用的场景和优缺点。在实际开发中,选择合适的方法可以提高代码的可读性和性能。

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

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

相关文章

【软考】系统架构设计师-信息安全技术基础

信息安全核心知识点 信息安全5要素&#xff1a;机密性、完整性、可用性、可控性、审查性 信息安全范围&#xff1a;设备安全、数据安全、内容安全、行为安全 网络安全 网络安全的隐患体现在&#xff1a;物理安全性、软件安全漏洞、不兼容使用安全漏洞、选择合适的安全哲理 …

【Node.js】Node.js 和浏览器之间的差异

Node.js 是一个强大的运行时环境&#xff0c;它在现代 JavaScript 开发中扮演着重要角色。然而&#xff0c;许多开发者在使用 Node.js 时常常会感到困惑&#xff0c;尤其是与浏览器环境的对比。本文将深入探讨 Node.js 和浏览器之间的差异&#xff0c;帮助你全面理解两者的设计…

用Python爬虫“偷窥”1688搜索词推荐:一场数据的奇妙冒险

在这个信息爆炸的时代&#xff0c;数据就像是藏在深海里的宝藏&#xff0c;等待着勇敢的探险家去发掘。今天&#xff0c;我们将化身为数据海盗&#xff0c;用Python作为我们的船只&#xff0c;航向1688的海域&#xff0c;去“偷窥”那些神秘的搜索词推荐。准备好了吗&#xff1…

【Redis】redis缓存击穿,缓存雪崩,缓存穿透

一、什么是缓存&#xff1f; 缓存就是与数据交互中的缓冲区&#xff0c;它一般存储在内存中且读写效率高&#xff0c;提高响应时间提高并发性能&#xff0c;如果访问数据的话可以先访问缓存&#xff0c;避免数据查询直接操作数据库&#xff0c;造成后端压力过大。 但是可能会面…

全面解析:HTML页面的加载全过程(一)--输入URL地址,与服务器建立连接

用户输入URL地址&#xff0c;与服务器建立连接 用户在浏览器地址栏输入一个URL 浏览器开始执行以下三步操作操作&#xff1a;url解析、DNS查询、TCP连接 第一步&#xff1a;URL解析 什么是URL&#xff1f; URL(Uniform Resource Locator&#xff0c;统一资源定位符)是互联网…

uni-ui自动化导入

2024年8月6日 https://uniapp.dcloud.net.cn/component/uniui/uni-ui.html 安装 https://www.npmjs.com/package/dcloudio/uni-ui npm i dcloudio/uni-ui配置自动导入功能 在pages.json文件里添加easycom节点: "easycom": {"autoscan": true,"custom…

实验三:构建园区网(静态路由)

目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验任务及要求 1、任务 1&#xff1a;完成网络部署 2、任务 2&#xff1a;设计全网 IP 地址 3、任务 3&#xff1a;实现全网各主机之间的互访 六、实验步骤 1、在 eNSP 中部署网络 2、配置各主机 IP …

电脑超频是什么意思?超频的好处和坏处

嗨&#xff0c;亲爱的小伙伴&#xff01;你是否曾经听说过电脑超频&#xff1f;在电脑爱好者的圈子里&#xff0c;这个词似乎非常熟悉&#xff0c;但对很多普通用户来说&#xff0c;它可能还是一个神秘而陌生的存在。 今天&#xff0c;我将带你揭开超频的神秘面纱&#xff0c;…

android 如何获取当前 Activity 的类名和包名

其一&#xff1a;getClass().getSimpleName() public static String getTopActivity(Context context){ ActivityManager am (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE); ComponentName cn am.getRunningTasks(1).get(0).topAct…

【YOLOv8】安卓端部署-2-项目实战

文章目录 1 准备Android项目文件1.1 解压文件1.2 放置ncnn模型文件1.3 放置ncnn和opencv的android文件1.4 修改CMakeLists.txt文件 2 手机连接电脑并编译软件2.1 编译软件2.2 更新配置及布局2.3 编译2.4 连接手机 3 自己数据集训练模型的部署4 参考 1 准备Android项目文件 1.1…

三十九、Python(pytest框架-中)

一、执行用例的方式 1.工具执行 2.在终端使用命令行运行 命令&#xff1a;pytest -s 用例代码文件 -s 的作用是输出显示代码中的 print。 3.在主函数main中执行 if __name__ "__main__": # 主函数pytest.main([-s, 用例代码文件]) import pytestclass TestDemo…

mybatis的动态sql用法之排序

概括 在最近的开发任务中&#xff0c;涉及到了一些页面的排序&#xff0c;其中最为常见的就是时间的降序和升序。这个有的前端控件就可以完成&#xff0c;但是对于一些无法用前端控件的&#xff0c;只能通过后端来进行解决。 后端的解决方法就是使用mybatis的动态sql拼接。 …

在AndroidStudio中新建项目时遇到的Gradle下载慢问题,配置错的按我的来,镜像地址不知道哪个网页找的,最主要下载要快

android-studio-2024.2.1.11-windows Android 移动应用开发者工具 – Android 开发者 | Android Developers https://r4---sn-j5o76n7z.gvt1-cn.com/edgedl/android/studio/install/2024.2.1.11/android-studio-2024.2.1.11-windows.exe?cms_redirectyes&met1731775…

项目配置文件选择(Json,xml,Yaml, INI)

选择使用哪种类型的配置文件&#xff08;如 JSON、XML 或其他格式&#xff09;取决于多个因素&#xff0c;包括项目的需求、团队的熟悉程度、数据结构的复杂性以及可读性和可维护性等。以下是对常见配置文件格式的比较&#xff0c;以及在不同情况下的推荐&#xff1a; 1. JSON&…

Vue学习记录07

列表渲染 v-for 可以使用v-for指令基于一个数组来渲染一个列表。v-for指令的值需要使用 item in items 形式的特殊语法&#xff0c;其中 items 是源数据的数组&#xff0c; 而 item 是迭代项的别名&#xff1a; const items ref([{ message: Foo }, { message: Bar }]) &l…

Android开发实战班 - 应用架构 - LiveData/Flow 数据流

在 MVVM 架构中&#xff0c;数据流是连接 ViewModel 和 View 的重要桥梁&#xff0c;用于实现数据的观察和响应。Jetpack 提供了两种主要的数据流机制&#xff1a;LiveData 和 Flow。本章节将深入讲解 LiveData 和 Flow 的概念、使用方法、区别以及在实际开发中的应用场景&…

rk3399开发环境使用Android 10初体验蓝牙功能

版本 日期 作者 变更表述 1.0 2024/11/10 于忠军 文档创建 零. 前言 由于Bluedroid的介绍文档有限&#xff0c;以及对Android的一些基本的知识需要了(Android 四大组件/AIDL/Framework/Binder机制/JNI/HIDL等)&#xff0c;加上需要掌握的语言包括Java/C/C等&#xff0…

python脚本实现csv中百度经纬度转84经纬度

数据准备 csv文件,带百度经纬度字段:bd09_x,bd09_y 目的 将百度经纬度转换为84经纬度,并在csv文件中添加两个字段:84_x,84_y python脚本 from ChangeCoordinate import ChangeCoordimport pandas as pd import numpy as npcoord = ChangeCoord()def bd09_to_wgs84

前端反向代理的配置和實現

反向代理是位於客戶端和服務器之間的一個中間層&#xff0c;它代表客戶端向伺服器發起請求&#xff0c;然後將伺服器的回應返回給客戶端。與傳統的正向代理不同&#xff0c;反向代理是由伺服器端配置的&#xff0c;客戶端通常不知道它的存在。在前端開發中&#xff0c;反向代理…

微调Helsinki-NLP-en-zh模型

Helsinki-NLP 是一个广泛使用的开源机器翻译&#xff08;Machine Translation&#xff0c;MT&#xff09;模型系列&#xff0c;基于 Marian NMT 框架 Hugggingface地址&#xff1a;https://huggingface.co/Helsinki-NLP/opus-mt-en-zh 原本的模型对于国内外公司的名称支持度很…