我查阅了Java文档,了解到Java的< code>Arrays类中的方法都是静态的。我真的不明白他们为什么把它变成静态的背后的原因。
例如,下面的代码违反了 OO 方法,因为如果我有一个类型“X”,那么所有作用于它的方法都应该在它里面:
int[] a = {34, 23, 12};
Arrays.sort(a);
如果他们实现了以下方式,那就更好了:
int[] a = {34, 23, 12};
a.sort();
任何人都可以解释一下我吗?
首先,Array
是一个实用程序类,它正是这样做的:公开静态方法。它与任何arr[]
实例分开,并且与它没有OO关系。有几个类似的类,例如Collection
或各种StringUtils
。
数组是集合,它们用于存储数据。数组.sort()
是一种对集合进行排序的算法。可能还有许多其他算法以不同的方式对数据进行排序,所有这些算法都将以相同的方式使用:MyAlgorithm.doSth与数组(数组)
。即使数组上有 sort()
方法(它必须是可排序数组
,因为并非所有对象都可以自动排序),所有其他算法也必须以旧方式调用。除非引入访客模式...但这会使事情变得太复杂,因此,没有意义。
对于java Collection,有Collections.sort()
,即使在C中也有std::排序
,其工作方式类似,在C中也是如此。我在这里没有看到问题,我看到了一致性。
良好的观察力。还要注意,并非每个数组都可以排序。只能对实现可比较
接口的基元数组和对象进行排序。因此,适用于所有数组的常规 sort()
方法是不可能的。因此,对于每种受支持的类型,我们都有几个重载的静态方法,这些类型实际上是可排序的。
@Holger在下面的评论中正确地指出,其中一个重载的静态方法确实是< code > arrays . sort(Object[]),但是文档明确声明:
数组中的所有元素必须实现<code>可比
因此,它不适用于未实现可比较
对象或其子接口之一。
在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。为什么不像静态 问题答案: 外部类已经是隐式静态的。 非静态嵌套类(=内部类)意味着内部类隐式对其父类具有引用。 这就是为什么对于嵌套类,您可以区分静态和非静态。对于外部类来说,这是没有意义的。 这是一个了解静态/非静态嵌套类之间的区别的示例。您应该了解为什么在外部类中它没有意义。