Java 对象创建的几种方式2025年3月17日 | 阅读 7 分钟 Java 中创建对象的五种不同方式
1) Java new 操作符这是 Java 中创建对象的流行方式。 new 操作符后面会跟着一个构造函数的调用,该构造函数会初始化新对象。当创建对象时,它会在堆中占用空间。 语法 Java new 操作符示例 输出 ![]() 2) Java Class.newInstance() 方法Java 的 Class.newInstance() 是 Class 类的方法。Class 类属于 java.lang 包。它创建一个由该 Class 对象表示的新类的实例。它返回新创建的类实例。 语法 如果类或其无参构造函数不可访问,则抛出 IllegalAccessException。如果 Class 表示一个抽象类、接口、数组类或基本类型,则它还会抛出 InstantiationException。 示例 输出 ![]() 3) Constructor 类的 newInstance() 方法Java 的 Constructor 类也像 Class 类的 newInstance() 方法一样拥有一个 newInstance() 方法。newInstance() 方法属于 java.lang.reflect.Constructor 类。两个 newInstance() 方法都称为创建对象的反射方式。事实上,Class 类的 newInstance() 方法内部使用了 Constructor 类的 newInstance() 方法。该方法通过调用构造函数返回一个新创建的对象。 语法 newInstance() 方法抛出以下异常
示例 输出 ![]() 4) Java Object.clone() 方法Java 的 clone() 方法创建现有对象的副本。它定义在 Object 类中。它返回此实例的克隆。关于 clone() 方法的两个最重要的点是:
当我们在类中使用 clone() 方法时,该类必须调用 super.clone() 来获取克隆的对象引用。 语法 如果 Object 类不支持 Cloneable 接口,该方法将抛出 CloneNotSupportedException。当覆盖 clone() 方法的子类指示实例无法克隆时,也会抛出此异常。 示例 输出 ![]() 5) Java 对象序列化和反序列化一个类必须实现 Serializable 接口,该接口属于 java.io 包。Serializable 接口没有任何方法和字段。它们为类添加了特殊行为。Java 8 中不再使用标记接口。它由注解取代。 每当我们序列化和反序列化对象时,JVM 都会创建一个单独的空间。它不使用任何构造函数来创建对象。 对象序列化ObjectOutputStream 类用于序列化对象。序列化是将对象转换为字节序列的过程。 ObjectOutputStream 类的 writeObject() 方法序列化对象并将指定的对象写入 ObjectOutputStream 类。该方法的签名是: 该方法接受一个对象作为参数。 对象反序列化从字节序列创建对象的过程称为对象反序列化。ObjectInputStream 类的 readObject() 方法从 ObjectInputStream 类读取对象并将其反序列化。该方法的签名是: 该方法不接受任何参数。它返回从流中读取的对象。该方法抛出以下异常:
示例 在下面的示例中,我们首先序列化了对象,然后反序列化了对象。 输出 ![]() Java 中克隆的概念在 OOP 中,复制对象意味着创建现有对象的克隆。有许多方法可以复制对象;其中两种是复制构造函数和克隆。Java 中有两种克隆类型:
深拷贝和浅拷贝都是对象克隆的类型。当我们谈论一个对象时,我们将其视为一个不能进一步分解的单一单元。 假设我们有一个 Student 对象。Student 对象包含其他对象,如下图所示。Student 对象包含 Name 和 Address 对象。Name 包含 FirstName 和 LastName 对象,Address 对象由 Street 和 city 对象组成。当我们谈论 Student 时,我们谈论的是整个对象网络。 ![]() 当我们想要修改或移动对象但仍保留原始对象时,就会创建对象的克隆。 浅克隆
例如,如果我们想创建一个 Student 的浅拷贝,我们应该创建一个 Student 的第二个对象。但是两个对象共享同一个 Name 和 Address。考虑以下示例: 浅拷贝的一个缺点是两个对象不独立。当我们修改一个 Student 的 Name 对象时,它也会修改其他 Student 对象。 在下面的示例中,我们有一个带有引用变量 mba 的 Student 对象;然后我们创建了 MBA 的副本,创建了一个第二个 Student 对象 mca。如果 mca 试图通过修改其 Address 对象来 moveOut(),则 mba 会随之移动。 这是因为 mba 和 mca 对象共享同一个 Address 对象。如果我们更改其中一个对象中的 Address,则两个对象都会被修改。 深克隆
当我们修改一个 Student 对象的 Address 对象时,它不会修改另一个 Student 对象。在上面的代码中,我们可以看到我们不仅在 Student 对象上使用了复制构造函数,还在内部对象上也使用了复制构造函数。 要创建深克隆,我们需要不断复制所有 Student 对象嵌套的元素,直到只剩下原始类型和不可变类型。 Street 对象有两个实例变量 name 和 number。number 是一个原始整数值,不是对象。它不能被共享。当我们创建第二个实例变量时,我们会自动创建一个独立的副本。上面的代码中的 String 是一个不可变对象,即一旦创建,就永远无法更改。因此,我们可以共享它而无需对其进行深拷贝。 下一个主题Java 教程 |
在构建应用程序时,必须首先考虑其安全性。每个应用程序都在网络上发布,存在安全、隐私和完整性风险。根据开放式Web应用程序安全项目(OWASP),最重要的安全风险是:存在各种框架...
阅读 2 分钟
互质数组的元素排列方式,使其相邻对显示的最大公约数值等于 1。我们需要计算将整数数组转换为互质格式所需的最小插入次数。这种数值分析很重要,因为它需要...
5 分钟阅读
在本节中,我们将学习二叉树的顶部视图以及实现它的不同方法。在二叉树的顶部视图中,我们只打印从二叉树顶部可见的节点...
阅读 4 分钟
TreeSet 是 Java 中的一个类,它实现了 Set 接口,并基于树数据结构。它提供了多种操作来以排序顺序管理和操作元素集合。在本文中,我们将讨论各种 TreeSet Java 操作...
5 分钟阅读
在本节中,我们将学习 Java 中的断言操作及其相应的示例。我们还将学习相应的断言类型。Java 中的断言是什么?“assert”关键字在 Java 中执行断言操作。断言的概念...
5 分钟阅读
? Java 中的 ArrayList 是一个动态可调整大小的数组,可以容纳任何类型的对象。在处理基于时间的数据时,将日期添加到 ArrayList 是常规活动。在本节中,我们将讨论将日期添加到 ArrayList 的各种方法...
5 分钟阅读
混淆的词典含义是使某事物不清晰或难以理解。在编程中,混淆器用于保护源代码免受黑客攻击。在本节中,我们将学习什么是代码混淆,混淆器的作用,混淆工具,以及它的用途。此外,我们将学习如何...
阅读 6 分钟
在本节中,我们将学习什么是十边形数,并创建计算十边形数的 Java 程序。十边形数程序经常在 Java 编码面试和学术界中被问到。十边形数:十边形数是形数,其递归定义为:D(n)...
5 分钟阅读
在 Java 中,Gson 是由 Google 开发的一个用于 JSON(JavaScript Object Notation)序列化和反序列化的库。Gson 在 Java 中的主要目的是将 Java 对象转换为 JSON 格式,反之亦然。让我们详细了解...
7 分钟阅读
Java 作为一种面向对象的编程语言,鼓励使用模块化代码以提高可维护性和可重用性。有助于代码组织的关键特性之一是包的概念。Java 中的包充当相关类、接口和其他资源的容器,允许开发人员...
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India