当前位置: 首页 > 知识库问答 >
问题:

为什么Java中的“数组”类方法都是静态的?

酆乐湛
2023-03-14

我查阅了Java文档,了解到Java的< code>Arrays类中的方法都是静态的。我真的不明白他们为什么把它变成静态的背后的原因。

例如,下面的代码违反了 OO 方法,因为如果我有一个类型“X”,那么所有作用于它的方法都应该在它里面:

int[] a = {34, 23, 12};
Arrays.sort(a);

如果他们实现了以下方式,那就更好了:

int[] a = {34, 23, 12};
a.sort();

任何人都可以解释一下我吗?

共有3个答案

祁飞翰
2023-03-14

首先,Array是一个实用程序类,它正是这样做的:公开静态方法。它与任何arr[]实例分开,并且与它没有OO关系。有几个类似的类,例如Collection或各种StringUtils

数组是集合,它们用于存储数据。数组.sort() 是一种对集合进行排序的算法。可能还有许多其他算法以不同的方式对数据进行排序,所有这些算法都将以相同的方式使用:MyAlgorithm.doSth与数组(数组)。即使数组上有 sort() 方法(它必须是可排序数组,因为并非所有对象都可以自动排序),所有其他算法也必须以旧方式调用。除非引入访客模式...但这会使事情变得太复杂,因此,没有意义。

对于java Collection,有Collections.sort(),即使在C中也有std::排序,其工作方式类似,在C中也是如此。我在这里没有看到问题,我看到了一致性。

余铭晨
2023-03-14

良好的观察力。还要注意,并非每个数组都可以排序。只能对实现可比较接口的基元数组和对象进行排序。因此,适用于所有数组的常规 sort() 方法是不可能的。因此,对于每种受支持的类型,我们都有几个重载的静态方法,这些类型实际上是可排序的。

@Holger在下面的评论中正确地指出,其中一个重载的静态方法确实是< code > arrays . sort(Object[]),但是文档明确声明:

数组中的所有元素必须实现<code>可比

因此,它不适用于未实现可比较对象或其子接口之一。

郏瀚
2023-03-14

在Java中,没有办法扩展数组的功能。数组都是从< code>Object继承的,但这提供的很少。依我看,这是Java的一个缺陷。

相反,为了为数组添加功能,静态实用程序方法被添加到类中,如<code>数组。这些方法是<code>静态

 类似资料:
  • 问题内容: Java main()方法的方法签名为: 此方法是否有理由是静态的? 问题答案: 该方法是静态的,因为否则会产生歧义:应调用哪个构造函数?特别是如果你的班级是这样的: JVM应该调用吗?它应该做什么x? 如果不是,JVM是否应该在不运行任何构造方法的情况下实例化?我认为不应该这样,因为这将对整个类进行特殊处理-有时你有一个尚未初始化的实例,并且必须在每个可以调用的方法中进行检查。 对于

  • 我知道在Java中,静态方法和实例方法一样是继承的,不同的是,当它们被重新声明时,父实现是隐藏的,而不是重写的。好吧,这有道理。但是,Java教程指出 接口中的静态方法从不继承。 然而,

  • 相对来说,我是java的业余爱好者,一直使用类和对象调用静态变量和方法。当它们是静态的时,类和对象都可以使用它们。 为什么程序员不对类变量和方法都保持默认的静态?

  • 我经常使用静态关键字,但不清楚静态关键字主要用途是什么。可以任意定义,这是在面向对象的java显示方法中使用的

  • 问题内容: 我正在查看Java代码,并注意到它使用了静态嵌套类。 使用静态嵌套类而不是普通内部类的原因是什么? 我能想到的唯一原因是Entry不能访问实例变量,因此从OOP的角度来看,它具有更好的封装性。 但是我认为可能还有其他原因,也许是性能。可能是什么? 注意。我希望我的术语正确,可以将其称为静态内部类,但是我认为这是错误的:http : //java.sun.com/docs/books/t

  • 问题内容: 在Java中,外部类可以是public,final,default或abstract。为什么不像静态 问题答案: 外部类已经是隐式静态的。 非静态嵌套类(=内部类)意味着内部类隐式对其父类具有引用。 这就是为什么对于嵌套类,您可以区分静态和非静态。对于外部类来说,这是没有意义的。 这是一个了解静态/非静态嵌套类之间的区别的示例。您应该了解为什么在外部类中它没有意义。