Java 中的对象切片10 Sept 2024 | 4 分钟阅读 “对象切片”这个术语指的是当派生类对象被赋值给基类实例时发生的情况。这会导致派生类对象丢失方法和成员变量。这被称为信息切片。例如, 因为 B 扩展了 A,所以 B 现在包含两个成员变量 a1 和 b1。因此,如果您创建一个类型为 B 的 a1 变量 b1,然后创建一个类型为 A 的变量并将其赋值为 b1,您将丢失成员变量 b1。例如, 在这种情况下,关于 b 的信息在 a.bar 中丢失了。这被称为成员切片。 将对象转换为信息更少的事物(通常是超类)称为对象切片。当对象按值传递并且复制参数值导致向上转型时,这在 C++ 中会发生,这被认为是有问题的,因为它可能导致非常微妙的问题。对象切片会浪费信息。但是,在某些情况下,这可能正是我们想要的。 Java 中的对象是按引用传递的,并且所有方法都是虚方法,因此对象切片不会意外发生。即使对象被向上转型,它的真实类型也不会丢失;这是多态性的定义。 考虑最基本的对象切片形式。假设 Child 类扩展了 Parent 类,并且我们有一个 Child 对象。我们想“提取”它的 Parent 部分。 这行不通,因为编译器会确保点后面跟着 super 的一个有效标识符。 同样,由于这是多态的,从 Parent 类返回它的引用是没有用的。将调用重写的方法而不是 Parent 类的方法,并且可以调用任何额外的。这正是我们想要阻止的。我们想要一个指向对象底层类型的代理,而不仅仅是限制接口,也不仅仅是数据和行为的副本。 我们可以通过这种方式建立一个指向对象基类型的代理:对于该 Parent 类型的子类,如果一个方法被重写,我们还可以添加一个使用 super 调用重写的方法。然后我们开发一个包装器来将调用重定向到适当的方法。然而,这并不优雅,因为它需要跟踪过多的信息。面向对象的方法是使用内部类。此外,由于我们无法使用反射调用 super 的方法,因此我们无法使用动态代理来避免实现基类的每个方法。 如何在 Java 中执行对象切片?让我们回想一下,为了实例化一个内部类,需要一个外部类的实例,并且可以从内部类访问外部对象的所有成员。 我们的计划是利用这个特性以及与 this 不同,super 不是多态的事实。 我们在 Child 类中构建一个内部类 Slice,它扩展了 Parent 并通过将所有 Parent 方法转发给外部对象的 Parent 部分来重写所有 Parent 方法。Child 类的 getParent() 函数返回一个 Slice 实例,它充当对象 Parent 部分的代理。 这是一个测试类,它演示了 getParent() 按预期工作,即它切片了对象 ObjectSlicing.java 输出 der 您可能想知道这有什么好处。毕竟,我们可以通过让派生类存储一个 Base 类型的引用来避免继承,该引用将在构造函数中创建或通过 setter 函数赋值。这通常不是一个好的做法。考虑需要通过 Male 和 Female 类进行增强的 Human 类。 从先前的 Human 实例构建 Male 和 Female 实例是没有意义的。我们有一个真正的 IS-A 关系,Male 和 Female 类应该有助于扩展 Human 类。而且,如果我们想在一个层中防止类型歧视,我们必须删除子类引入的额外信息或行为更改。 下一个主题Oracle Java |
在本教程中,我们将了解如何在 Java 中查找数组元素的索引。为避免混淆,我们将假设数组中的所有元素都是唯一的。换句话说,任何元素都不会出现一次以上。在输入中,一个...
阅读9分钟
在本节中,我们将讨论什么是“有害数”,并创建 Java 程序来检查给定的数字是否是“有害数”。“有害数”程序经常在 Java 编码面试和学术中出现。“有害数” 如果一个数字中 1 的总数……
阅读 4 分钟
? 美国信息交换标准代码(ASCII)的完整形式。它是一种数值表示的字符。Java 使用 Unicode 系统并支持多种语言。为了简洁起见,让我们理解它首先将字符转换为……
阅读 3 分钟
在 Java 中,类是用于创建实例和定义其行为的基本构建块。类充当蓝图或模板,它封装了数据(以变量的形式)和操作这些数据的方法(函数)。最重要的类型之一...
阅读 4 分钟
为了编写更灵活、可重用且类型安全的代码,开发人员需要使用 Java 编程语言的泛型功能。泛型最初在 Java 5 中可用,此后已成为任何 Java 开发人员工具箱中的关键组成部分。在本节中,我们……
阅读 4 分钟
java.nio.charset 的一个内置方法是 maxBytesPerChar()。对于每个输入字符,CharsetEncoder 返回将创建的最大字节数。使用该值可以确定给定输入句子在最坏情况下的输出缓冲区大小...
阅读 2 分钟
在 Java 中,内存管理和垃圾回收是维持最佳性能和避免内存泄漏的关键方面。与 Java 的垃圾回收机制相关的有趣概念是孤岛。这个术语指的是一组相互引用但...
阅读 4 分钟
Java 是一种通用且广泛使用的编程语言,拥有众多使其在开发者中广受欢迎的特性。然而,与任何复杂的工具一样,它也伴随着自身的挑战。其中一项挑战是歧义——一个即使让...
阅读 4 分钟
问题陈述给定一个二进制字符串,我们需要找到给定二进制字符串中 0 和 1 的最大差值。在这里,我们将 0 视为 +1,将 1 视为 -1,然后寻找连续子数组的最大值。这个子数组的最大和……
阅读 4 分钟
在本节中,我们将讨论 Java 中的方法隐藏是什么、方法隐藏因素 (MHF) 以及方法隐藏和方法重写的区别。此外,还将实现 Java 程序中的方法隐藏概念。要理解 Java 中的方法隐藏概念,首先我们将理解...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India