首页 / JAVA / Java Object 类
Java Object 类
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java Object 类,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4445字,纯文字阅读大概需要7分钟。
内容图文
1.什么是 Object 类
-
Object 类是干嘛的?
-
是谁的爹?
- 除了基本类型(primitive types)和接口所有人的爹。为什么它不是接口的爹?Object表示我不想当你爹
- 还是所有数组的爹,不管是对象数组,还是基本类型数组都一样
-
在没有指明超类的情况下,默认继承
Object
类,因而不需要特别去写public class Daddy extends Object
2.Object 类的所有方法
变量和类型 | 方法 | 描述 |
---|---|---|
protected Object | clone() | 创建并返回此对象的副本。 |
public boolean | equals(Object obj) | 指示某个其他对象是否“等于”此对象。 |
protected void | finalize() | 已过时。 最终确定机制本质上存在问题。 |
public final Class | getClass() | 返回此 Object的运行时类。 |
public int | hashCode() | 返回对象的哈希码值。 |
public String | toString() | 返回对象的字符串表示形式。 |
public final void | notify() | 唤醒正在此对象监视器上等待的单个线程。 |
public final void | notifyAll() | 唤醒等待此对象监视器的所有线程。 |
public final void | wait() | 导致当前线程等待它被唤醒,通常是 通知或 中断 。 |
public final void | wait(long timeoutMillis) | 导致当前线程等待它被唤醒,通常是 通知或 中断 ,或者直到经过一定量的实时。 |
public final void | wait(long timeoutMillis, int nanos) | 导致当前线程等待它被唤醒,通常是 通知或 中断 ,或者直到经过一定量的实时。 |
3.equals()方法
-
equals() 方法具有的特性
-
自反性:对于任何非空引用 x, x.equals(x) 应该返回 true
-
对称性: 对于任何引用 x 和 y, 当且仅当 y.equals(x) 返回 true , x.equals(y) 也应该返回 true。
-
传递性: 对于任何引用 x、 y 和 z, 如果 x.equals(y) 返回true, y.equals(z) 返回 true, x.equals(z) 也应该返回 true。
-
一致性: 如果 x 和 y 引用的对象没有发生变化,反复调用 x.equals(y) 应该返回同样的结果。
-
对于任意非空引用 x, x.equals(null) 应该返回 false。
-
-
如何正确的写一个 equals() 方法,给出实例
@Override public boolean equals(Object otherObject){ //检测 otherObject 是否引用同一个对象 if(this == otherObject) return true; //检测 otherObject 是否为 null,如果为 null,返回 false if(otherObject == null) return false; //比较 this 与 otherObject 是否属于同一个类 if(getClass() != otherObject.getClass()) return false; //将 otherObject 转换为相应的类类型变量 ClassName other = (ClassName) otherObject; //现在开始对所有需要比较的域进行比较了。使用 == 比较基本类型域,使用 equals 比较对象域。 //如果所有的域都匹配, 就返回 true; 否则返回 false。 return field1 == other.field1 &&Object.equals(field2,other.field2) &&...; }
如果在子类中重新定义 equals ,就要在其中包含调用
super.equals(other)
对于数组类型的域,可以使用静态的
Arrays.equals
方法检测相应的数组元素是否相等
4.hashCode 方法
-
什么是 hash code ?
散列码( hash code ) 是由对象导出的一个整型值(其值由一个hash函数计算得来)。散列码是没有规律的。如果 x 和 y 是两个不同的对象,
x.hashCode( )
与y.hashCode( )
基本上不会相同。 -
hashCode() 的一般规则
- 只要在执行Java应用程序期间多次在同一对象上调用它,
hashCode
方法必须始终返回相同的整数,前提是不修改对象上的equals
比较中使用的信息。 从应用程序的一次执行到同一应用程序的另一次执行,该整数不需要保持一致。 - 如果两个对象根据
equals(Object)
方法相等,则对两个对象中的每个对象调用hashCode
方法必须生成相同的整数结果。 - 这不是必需的:如果两个对象根据不相等
equals(java.lang.Object)
方法,然后调用hashCode
在各两个对象的方法必须产生不同的整数结果。 但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能。
- 只要在执行Java应用程序期间多次在同一对象上调用它,
-
如果重新定义 equals方法,就必须重新定义 hashCode 方法
原因未知,等了解后补。
-
怎么给类重写 hashCode() 方法
public int hashCode(){ return Objects.hash(Object... objects); }
5.toString 方法
-
toString 干嘛用的
返回对象的字符串表示形式。
-
建议所有子类都覆盖此方法。若没有覆盖,返回字符串是什么样子的?
getClass().getName() + '@' + Integer.toHexString(hashCode())
若 Employee 类直接调用 toString() 方法返回的结果可能为
Employee@c0001041
-
重写 toString() 方法实例
/** * Employee e = new Employee("hrm",5000,1998,11,11); * 输出为 Employee[name=hrm,salary=5000.0,hireDay=1998-11-11] */ public String toString(){ return getClass().getName() + "[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay + "]"; }
若超类使用了
getClass().getName()
,那么子类只要调用super.toString()
就可以了。 -
只要对象与一个字符串通过操作符“ +” 连接起来,Java 编译就会自动地调用 toString方法,以便获得这个对象的字符串描述。
-
数组的特殊
数组虽然继承了 Object 类的 toString 方法,但他还是要按照旧的格式打印
/** * 数组将按旧格式输出打印 * [I 表明是一个整数数组 * @param arr {2,3,5,7,11,13} * @return [I@180bc464 */ public String arraysToString(int[] arr){ return "" + arr; }
改进方式,采用
Arrays.toString
方法/** * 采用 Arrays.toString(arr); * @param arr {2,3,5,7,11,13} * @return [2, 3, 5, 7, 11, 13] */ public String arraysToStringNew(int[] arr){ return Arrays.toString(arr); }
如果想打印多维数组,需要调用
Arrays.deepToString()
方法
内容总结
以上是互联网集市为您收集整理的Java Object 类全部内容,希望文章能够帮你解决Java Object 类所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。