java.lang.Object(java.lang.对象) |
课程概述
Java类层次结构的根类。所有非原始类型(包括数组)直接或间接从此类继承。写一个正确的等于
方法
遵循此样式编写规范等于
方法:
//使用@Override可避免意外过载。@覆盖公共布尔值等于(对象o){//如果对象相同,则返回true。//(这只是一个优化,不需要正确性。)如果(此==o){返回true;}//如果其他对象的类型错误,则返回false。//此类型可能是一个接口,具体取决于接口的规范。if(!(MyType的o实例)){返回false;}//铸造成合适的类型。//这将因为instanceof而成功,并允许我们访问私有字段。MyType lhs=(MyType)o;//检查每个字段。基本字段、引用字段和可为null的引用//所有领域都有不同的待遇。return primitiveField==lhs.primitiveFiield&&referenceField.equals(lhs.referenceFild)&&(nullableField==null?lhs.nullableField==null:nullableField.equals(lhs.nullableField));}
如果您覆盖等于
,您还应该重写哈希代码
:等于实例必须具有相等的哈希代码。
请参见通用程序设计第8项了解更多细节和澄清。写一个正确的哈希代码
方法
遵循此样式编写规范哈希代码
方法:
@重写public int hashCode(){//从非零常数开始。int结果=17;//包括每个字段的哈希。result=31*result+(booleanField?1:0);结果=31*result+byteField;result=31*result+charField;result=31*result+shortField;result=31*result+intField;result=31*result+(int)(longField^(longField>>32));结果=31*result+Float.floatToIntBits(floatField);long doubleFieldBits=Double.doubleToLongBits(双字段);结果=31*结果+(int)(doubleFieldBits^(double FieldBits>>>32));result=31*result+Arrays.hashCode(arrayField);result=31*result+referenceField.hashCode();结果=31*result+(nullableReferenceField==null?0:nullableReferenceField.hashCode());返回结果;}
如果您不想将类型用作散列键,不要简单地依赖默认值哈希代码
实现,因为这会无声无息地破坏任何未来将类型用作哈希键的代码。你应该扔:
@重写public int hashCode(){抛出新的UnsupportedOperationException();}
请参见通用程序设计第9项了解更多细节和澄清。编写有用的toString(字符串)
方法
为了调试方便,通常重写toString(字符串)
以这种风格:
@重写public String toString(){return getClass().getName()+“[”+“primitiveField=”+primitiveField+“,”+“referenceField=”+referenceField+“,”+“arrayField=”+Arrays.toString(arrayField)+“]”;}
要包含的字段集通常与要测试的字段集相同在您的等于
实施。
请参见通用程序设计第10项了解更多细节和澄清。
总结
公共方法 |
布尔值
|
等于(对象o)
将此实例与指定对象进行比较,并指示它们是否都是平等的。
|
最终的等级<?>
|
获取类()
|
整数
|
哈希代码()
返回此对象的整数哈希代码。
|
最终的空隙
|
通知()
导致线程等待此对象的监视器(通过呼叫其中一个wait() 方法)被唤醒。
|
最终的空隙
|
通知全部()
导致所有等待此对象监视器的线程(通过呼叫其中一个wait() 方法)被唤醒。
|
字符串
|
toString(字符串)()
返回一个字符串,该字符串包含此对象。
|
最终的空隙
|
等待()
使调用线程等待另一个线程调用通知() 或notifyAll() 方法。
|
最终的空隙
|
等待(长毫微秒,整数纳米)
使调用线程等待另一个线程调用通知() 或notifyAll() 方法或直到指定的超时过期。
|
最终的空隙
|
等待(长毫)
使调用线程等待另一个线程调用通知() 或notifyAll() 方法或直到指定的超时过期。
|
受保护的方法 |
对象
|
克隆()
创建并返回此对象 。
|
空隙
|
最后确定()
当垃圾收集器检测到此实例不再可访问时调用。
|
公共建筑商
公共方法
公众布尔值
等于
(对象o)
将此实例与指定对象进行比较,并指示它们是否都是平等的。为了平等,o(o)
必须表示同一对象在本例中使用了类特定的比较。总承包合同这种比较应该是自反的、对称的和传递的。此外,除了null之外,没有其他对象引用等于null。
默认实现返回真的
只有这个==o(o)
。请参阅写一个正确的等于
方法如果你打算实现你自己的等于
方法。
通用合同等于
和哈希代码()
方法是如果等于
收益真的
对于那么,任意两个对象哈希代码()
必须为返回相同的值这些对象。这意味着对象
通常重写这两个方法或两者都不重写。
公众最终的等级<?>
获取类
()
返回的唯一实例等级
代表这个对象的类。请注意获取类()
是一个特例实际回报等级 extends Foo>
哪里富
是删除表达式类型获取类()
被召唤。
例如,下面的代码实际上可以编译,尽管可能认为不应该:
列表l=新的ArrayList();等级 extends List>c=l.获取类();
公众整数
哈希代码
()
返回此对象的整数哈希代码。根据合同,任何两个对象,其中等于(对象)
收益真的
必须返回相同的散列码值。这意味着对象
通常重写这两个方法或两个方法都不重写。
请注意,哈希值不得随时间变化,除非在equals中使用信息比较也会发生变化。
请参见写一个正确的哈希代码
方法如果你打算实现你自己的哈希代码
方法。
公众最终空隙
通知
()
导致线程等待此对象的监视器(通过呼叫其中一个wait()
方法)被唤醒。如果超过一个线程正在等待,其中一个线程由虚拟机。所选线程不会立即运行。线程那个叫通知()
必须先释放对象的监视器。此外,所选线程还必须与其他线程竞争尝试在同一对象上同步。
此方法只能由拥有此对象的监视器。线程成为对象监视器的所有者
- 通过执行该对象的同步方法;
- 通过执行
已同步
声明在对象上同步;
- 如果对象为类型,则执行同步静态方法
等级
。
公众最终空隙
通知全部
()
导致所有等待此对象监视器的线程(通过呼叫其中一个wait()
方法)被唤醒。线程不会立即运行。调用的线程通知()
必须这样做首先释放对象的监视器。此外,线程还必须与尝试在同一对象上同步的其他线程竞争。
此方法只能由拥有此对象的监视器。线程成为对象监视器的所有者
- 通过执行该对象的同步方法;
- 通过执行
已同步
声明在对象上同步;
- 如果对象为类型,则执行同步静态方法
等级
。
公众的字符串
toString(字符串)
()
返回一个字符串,该字符串包含此对象。鼓励子类重写此方法并提供考虑对象类型和数据的实现。这个默认实现等效于以下表达式:
getClass().getName()+“@”+整数.toHexString(hashCode())
请参见编写有用的toString(字符串)
方法如果你打算实现你自己的toString(字符串)
方法。
公众最终空隙
等待
()
使调用线程等待另一个线程调用通知()
或notifyAll()
方法。此方法可以仅由拥有此对象监视器的线程调用;看见通知()
线程如何成为监视器的所有者。
可以发送等待线程中断()
使其过早地停止等待,所以等待
应在循环中调用检查之前是否满足了等待的条件持续的。
当线程等待时,它放弃了该对象监视器的所有权。当收到通知(或中断)时,它会在之前重新获取监视器它开始运行。
公众最终空隙
等待
(长毫微秒,整数纳米)
使调用线程等待另一个线程调用通知()
或notifyAll()
方法或直到指定的超时过期。此方法只能由线程调用拥有此对象监视器的;看见通知()
关于线程如何可以成为显示器的所有者。
可以发送等待线程中断()
使其过早地停止等待,所以等待
应在循环中调用检查之前是否满足了等待的条件持续的。
当线程等待时,它放弃了该对象监视器的所有权。当收到通知(或中断)时,它会在之前重新获取监视器它开始运行。
参数
毫微秒
| 以毫秒为单位的最大等待时间。 |
纳米
| 等待的毫秒数,在中指定纳秒。 |
公众最终空隙
等待
(长毫)
使调用线程等待另一个线程调用通知()
或notifyAll()
方法或直到指定的超时过期。此方法只能由线程调用拥有此对象监视器的;看见通知()
关于线程如何可以成为监视器的所有者。
可以发送等待线程中断()
使其过早地停止等待,所以等待
应在循环中调用检查之前是否满足了等待的条件持续的。
当线程等待时,它放弃了该对象监视器的所有权。当它被通知(或中断)时,它会在它开始运行。
受保护的方法
受保护的对象
克隆
()
创建并返回此对象
。默认值实现返回一个所谓的“浅”副本:它创建一个新的实例,然后复制字段值(包括对象引用)。“深度”拷贝,相反,也会递归克隆嵌套对象。一个子类需要实现这种克隆应该调用超级克隆()
创建新实例,然后创建嵌套的深层副本,可变对象。
受保护的空隙
最后确定
()
当垃圾收集器检测到此实例不再可访问时调用。默认实现不执行任何操作,但可以重写此方法以释放资源。
请注意,覆盖最后确定
明显比对象。终结器可能会在对象不再存在后运行很长一段时间可访问,这取决于内存压力,因此依靠它们进行清理是个坏主意。还要注意,终结器在单个VM范围的终结器线程上运行,因此,在终结器中执行阻塞工作是一个坏主意。通常只需要终结器对于具有本机对等点并且需要调用本机方法来销毁该对等点的类。即使如此,最好提供一个明确的关闭
方法(和实现可关闭
),并坚持要求调用方手动处置实例。这个适用于类似文件的东西,但对于类似大整数
其中典型的调用代码将不得不处理大量临时代码。不幸的是,从以下观点来看,创建大量临时代码的代码是最糟糕的代码类型单个终结器线程。
如果你必须使用终结器,至少考虑提供您自己的终结器引用队列
并拥有自己的线程处理该队列。
与构造函数不同,终结器不会自动链接。你有责任打电话super.finalize()
你自己。
终结器抛出的未捕获异常将被忽略,并且不会终止终结器线程。请参见通用程序设计第7项,“避免终结器”了解更多信息。