为什么';数组';类别';Java中的所有静态方法?
我阅读了Java文档,了解到Java中为什么';数组';类别';Java中的所有静态方法?,java,arrays,static,Java,Arrays,Static,我阅读了Java文档,了解到Java中Arrays类中的方法都是静态的。我真的不明白为什么他们让它静止 例如,以下代码违反了OO方法,因为如果我有一个类型“X”,那么所有作用于它的方法都应该在它内部: int[] a = {34, 23, 12}; Arrays.sort(a); 如果他们采用以下方式,情况会更好: int[] a = {34, 23, 12}; a.sort(); 谁能给我解释一下吗?观察得很好。还要注意,并非每个数组都可以排序。只能对实现接口的原语和对象数组进行排序。因此
Arrays
类中的方法都是静态的。我真的不明白为什么他们让它静止
例如,以下代码违反了OO方法,因为如果我有一个类型“X”,那么所有作用于它的方法都应该在它内部:
int[] a = {34, 23, 12};
Arrays.sort(a);
如果他们采用以下方式,情况会更好:
int[] a = {34, 23, 12};
a.sort();
谁能给我解释一下吗?观察得很好。还要注意,并非每个数组都可以排序。只能对实现接口的原语和对象数组进行排序。因此,应用于所有数组的常规
sort()
方法是不可能的。因此,对于每个支持的类型,我们都有几个重载的静态方法,这些方法实际上是可排序的
更新:
在下面的注释中正确地指出,其中一个重载静态方法确实是,但文档明确指出:
数组中的所有元素都必须实现接口
因此,它不适用于未实现的对象或其子接口之一。静态方法有时用于实用目的。 所以数组是通用数组操作的实用类。
类似地,也是Util类,其中提供了实用程序方法。在Java中,无法扩展数组的功能。数组都继承自
对象
,但这提供的信息很少。这是Java的一个缺陷
相反,为了为数组添加功能,静态实用程序方法被添加到类中,如
Array
和arrays
。这些方法是静态的,因为它们不是实例方法。首先,Arrays
是一个实用类,它的作用就是:公开静态方法。它独立于任何arr[]
实例,与之没有OO关系。有几种类似的类,如Collections
或各种StringUtils
数组是集合,用于存储数据Arrays.sort()
是一种对集合进行排序的算法。可能还有许多其他算法以不同的方式对数据进行排序,它们都将以相同的方式使用:MyAlgorithm.dosswitharray(array)
。即使数组上有一个sort()
方法(它必须是SortableArray
,因为并非所有对象都可以自动排序),所有其他算法都必须以旧方法调用。除非引入访客模式。。。但这让事情变得太复杂了,因此没有意义
你可以读到这本书 数组有点像二级泛型。当您创建一个数组时,它会为数组类型创建一个自定义类,但它不是全功能的,因为它们在真正充实语言之前就决定了数组的工作方式 这与保持向后兼容性相结合,意味着数组只能使用过时的接口
它只是API的一个老部分。数组不是存储状态的对象,超出了数组的实际值。换句话说,它只是一个“愚蠢的容器”。它不“知道”任何行为 实用程序类是一个只有
公共静态
方法的类,这些方法是无状态函数。排序是无状态的,因为对该方法的调用之间没有任何记忆。它运行“独立”,将其公式应用于传入的任何对象,只要该对象是“可排序的”。Arrays
类的第二个实例的行为没有什么不同,因此只需使用一个静态
实例即可
正如Dariusz指出的,有不同的排序方法。因此,您可以使用MyArrays.betterSort(array)
以及Arrays.sort(array)
如果您想让数组“知道”如何最好地对自己的成员进行排序,那么您必须拥有自己的数组类,该类扩展了数组
但是,如果您在同一阵列上的不同时间需要不同的排序,会怎么样?也许这是一个人为的例子,但现实世界中有很多类似的例子
现在你变得复杂了。可能是T
类型的数组排序与S
类型不同
它通过静态实用程序和
比较器接口变得简单。数组类包含独立于状态的方法,因此它们应该是静态的。它本质上是一个实用类
虽然OOP原则不适用,但当前的方法更清晰、简洁、可读性更强,因为您不必担心多态性和继承性。这一切都缩小了范围,最终导致
现在,您可能会问自己:“为什么我不能在Java中扩展数组的功能?”。一个很好的答案是,这可能会破坏系统代码。但是java数组有一个length
属性,它不是来自Object
。那么为什么不能添加其他属性甚至方法呢?@asahlength
只读属性在JLS中定义,并有自己的字节码指令<代码>数组长度
扩展它不像向类中添加方法那么简单。我同意这是一个定义