javaObject类的概述详细解析
基本概念
- java.lang.Object类是Java语言中类层次结构的根类,也就是说任何一个类都是该类的直接或者间接子类。
- 如果定义一个Java类时没有使用extends关键字声明其父类,则其父类为 java.lang.Object 类。
- Object类定义了“对象”的基本行为, 被子类默认继承。
常用的方法
方法声明 | 功能介绍 |
---|---|
Object() | 使用无参方式构造对象 |
boolean equals(Object obj) | 用于判断调用对象是否与参数对象相等。 该方法默认比较两个对象的地址是否相等,与 == 运算符的结果一致 若希望比较两个对象的内容,则需要重写该方法。 若该方法被重写后,则应该重写hashCode方法来保证结果的一致 性。 |
int hashCode() | 用于获取调用对象的哈希码值(内存地址的编号)。 若两个对象调用equals方法相等,则各自调用该方法的结果必须相同 若两个调用对象equals方法不相等,则各自调用该方法的结果应该 不相同。 为了使得该方法与equals方法保持一致,需要重写该方法。 |
String toString() | 用于获取调用对象的字符串形式 该方法默认返回的字符串为:包名.类名@哈希码值的十六进制 为了返回更有意义的数据,需要重写该方法 使用print或println打印引用或字符串拼接引用都会自动调用该方法 |
Class getClass() | 用于返回调用对象执行时的Class实例,反射机制使用 |
注意事项
-
equals协定
-
方法在非null对象引用上实现等价关系:–> 否则会引发空指针异常(NullPointerException)
-
自反性 :对于任何非空的参考值
x
,x.equals(x)
应该返回true
。 -
它是对称的 :对于任何非空引用值
x
和y
,x.equals(y)
应该返回true
当且仅当y.equals(x)
回报true
-
传递性 :对于任何非空引用值
x
,y
和z
,如果x.equals(y)
回报true
个y.equals(z)
回报true
,然后x.equals(z)
应该返回true
。 -
对于任何非空的参考值
x
,x.equals(null)
应该返回false
。 -
通常需要在重写此方法时覆盖
hashCode
方法,以便维护hashCode
方法的常规协定,该方法声明相等对象必须具有相等的哈希代码。/** * 为了比较两个对象的内容 需要重写该方法 */ @Override public boolean equals(Object obj){ // 当调用对象和参数队形指向同一个对象 则内容一定相同 if (this == obj) return true; // 调用对象为 不为空 而参数对象为空是 则内容一定不相同 if(obj == null) return false; // 判断obj指向的对象是否为Student类型的对象 若是条件成立 返回执行的结果 如果不是条件不成立 没有返回值 if (obj instanceof Student){ Student ts = (Student) obj; return this.getId() == ts.getId(); } System.out.println("-----"); // 否则类型不一致 没有可比性 这内容一定不相同 return false; }
-
-
-
hashCode的协定
-
只要在执行Java应用程序期间多次在同一对象上调用它,
hashCode
方法必须始终返回相同的整数,前提是不修改对象上的equals
比较中使用的信息。 从应用程序的一次执行到同一应用程序的另一次执行,该整数不需要保持一致。 -
如果两个对象根据
equals(Object)
方法相等,则对两个对象中的每个对象调用hashCode
方法必须生成相同的整数结果 -
这不是必需的:如果两个对象根据不相等
equals(java.lang.Object)
方法,然后调用hashCode
在各两个对象的方法必须产生不同的整数结果。 但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能@Override public int hashCode(){ // return getId(); // 不在代表内存地址的编号 final int type = 12; return type * 31 + getId(); }
-