为什么不将java.lang.Object
类声明为抽象类?
为了使Object有用,肯定需要增加状态或行为,Object类是一个抽象,因此应该将其声明为abstract … 为什么他们选择不这样做?
安德,我认为您正在以不必要的抽象程度接近此目标(双关不是故意的)。我认为这种(IMHO)不必要的抽象级别是造成此处“问题”的原因。也许您是从数学理论方法来解决这个问题的,而我们中的许多人都是从“试图解决问题的程序员”的方法解决这个问题的。我认为这种方法上的差异导致了分歧。
当程序员着眼于实用性以及如何实际 实现
某些东西时,有时会需要一些完全与实际实例无关的任意对象。它不能为空。我在另一篇文章的评论中给出的示例是*Set
(*
==
Hash
或Concurrent
选择类型)的实现,通常是通过使用背景*Map
并将Map
键用作Set来实现的。您通常不能将其null
用作Map
值,因此通常要做的是使用静态Object
实例作为值,该实例将被忽略并且从不使用。但是,需要一些非空的占位符。
另一个常见的用途是与synchronized
其中的关键字 有些
Object
是需要同步,并且要确保你的同步产品完全私人避免死锁,不同的类无意中在同一个锁进行同步。一个非常常见的习惯用法是分配一个private final Object
在类中用作锁的语言。公平地讲,从Java
5和java.util.concurrent.locks.Lock
相关的附加功能开始,该习惯用法明显不太适用。
从历史上看,Object
可实例化在Java中非常有用。您可能会指出,只要对设计进行较小的更改或对API进行较小的更改,就不再需要这样做。您可能是正确的。
是的,API可能已经提供了一个Placeholder
扩展类,Object
根本不添加任何内容,就可以用作上述目的的占位符。但是-
如果您要扩展Object
但什么也不添加,那么除了允许Object
抽象之外,该类中的值是什么?从数学上讲,理论上也许可以找到一个价值,但在实用上,这样做会增加什么价值呢?
在编程中有时需要一个对象, 某个 对象, 任何
不为null的具体对象,可以通过==
和/或进行比较的对象.equals()
,但是您不需要此对象的任何其他功能。它仅作为唯一标识符存在,否则绝对不起作用。
Object
完美地(IMHO)完全满足此角色。
我想 这 就是为什么Object
不声明为抽象的部分原因:不声明它是直接有用的。
问题内容: 为什么即使该类中没有抽象方法,也将类声明为抽象? 问题答案: 这是因为它遵循模板方法设计模式。这些方法具有返回HTTP 405 未实现方法 错误的所有默认行为。如果所有这些方法都是抽象的,那么即使您的业务需求根本不需要它们,也将不得不覆盖所有这些方法。这只会导致样板代码和不确定/不直观的行为。
问题内容: 我了解抽象类中的方法都可以是抽象的,也可以不是。但是,为什么不能在“普通”的非抽象类中创建抽象方法呢? 在此先感谢您的解释! 问题答案: 抽象 方法从根本上说,该方法没有实现,需要在 子类中 实现。但是,如果您在 非抽象 类中具有 抽象 方法,则可以实例化该类并获取一个对象,该对象将具有未实现的方法,您将无法调用该方法。 __
问题内容: 这是我的代码,假设可以在按下按钮时更改一些文本:- 用下划线标记,它给我一个错误“类必须声明为抽象或实现抽象方法”。该代码大部分是从互联网上复制的,并且可以正常工作。可能仅是Android Studio错误。我如何使它工作? 问题答案: 必须实现该函数,否则您的类应该是抽象的,以便可以在某些子类中实现您的函数。但是在您的情况下,您犯了一个拼写错误。应该代替;
问题内容: 将接口声明为抽象有什么意义?接口方法也是如此。有什么意义吗? 例如。 问题答案: 您在哪里遇到过已发布的代码块,任何旧的Java代码库? 这就是 JLS不得不说: 9.1.1.1抽象接口: 每个接口都是隐式抽象的。该修饰符已过时,不应在新程序中使用。 9.4抽象方法声明: 为了与Java平台的较早版本兼容,出于风格考虑,允许但不鼓励为接口中声明的方法冗余地指定abstract修饰符。
在这部分内容中我们将探索下像Backbone.js这类框架如何适应JavaScript应用架构。通常,开发者创建桌面和服务器类应用有丰富的设计模式供他们去选择,但是,在过去的仅仅几年中,这些模式已经应用到了客户端开发中。 在开始探索任何JavaScript框架之前,非常有必要先认知一下设计模式原理。 MVC,MVP和Backbone.js 设计模式可以解决通用开发问题,可以引导开发者给他们的应用增
“绑定不匹配:Team类型不是league类型 的有界参数 >的有效替代品。”