为什么';数组';类别';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(); 谁能给我解释一下吗?观察得很好。还要注意,并非每个数组都可以排序。只能对实现接口的原语和对象数组进行排序。因此

我阅读了Java文档,了解到Java中
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
,因为并非所有对象都可以自动排序),所有其他算法都必须以旧方法调用。除非引入访客模式。。。但这让事情变得太复杂了,因此没有意义


集合中有<代码>集合.SoTo()/Cuff>,即使C++中也有<代码> STD::排序,它的工作方式类似,C中的代码> QSORACE >。我看不出有什么问题,我看到了一致性。

对我来说,这是一个完美的解决方案。我有一个数组,还有一个类Arrays,它对数组中的数据进行操作。例如,您可能想要保存一些随机数,并且您永远不会想要排序或任何其他实用方法,您将收到您不想要的行为。这就是为什么在代码设计中最好将数据与行为分开


你可以读到这本书

数组有点像二级泛型。当您创建一个数组时,它会为数组类型创建一个自定义类,但它不是全功能的,因为它们在真正充实语言之前就决定了数组的工作方式

这与保持向后兼容性相结合,意味着数组只能使用过时的接口


它只是API的一个老部分。

数组不是存储状态的对象,超出了数组的实际值。换句话说,它只是一个“愚蠢的容器”。它不“知道”任何行为

实用程序类是一个只有
公共静态
方法的类,这些方法是无状态函数。排序是无状态的,因为对该方法的调用之间没有任何记忆。它运行“独立”,将其公式应用于传入的任何对象,只要该对象是“可排序的”。
Arrays
类的第二个实例的行为没有什么不同,因此只需使用一个
静态
实例即可

正如Dariusz指出的,有不同的排序方法。因此,您可以使用
MyArrays.betterSort(array)
以及
Arrays.sort(array)

如果您想让数组“知道”如何最好地对自己的成员进行排序,那么您必须拥有自己的数组类,该类扩展了数组

但是,如果您在同一阵列上的不同时间需要不同的排序,会怎么样?也许这是一个人为的例子,但现实世界中有很多类似的例子

现在你变得复杂了。可能是
T
类型的数组排序与
S
类型不同


它通过静态实用程序和
比较器接口变得简单。
数组
类包含独立于状态的方法,因此它们应该是
静态的。它本质上是一个实用类

虽然OOP原则不适用,但当前的方法更清晰、简洁、可读性更强,因为您不必担心多态性和继承性。这一切都缩小了范围,最终导致


现在,您可能会问自己:“为什么我不能在Java中扩展数组的功能?”。一个很好的答案是,这可能会破坏系统代码。

但是java数组有一个
length
属性,它不是来自
Object
。那么为什么不能添加其他属性甚至方法呢?@asah
length
只读属性在JLS中定义,并有自己的字节码指令<代码>数组长度
扩展它不像向类中添加方法那么简单。我同意这是一个定义