Object类:所有类的超类(父类)。 所有对象(包括数组)都实现了这个类的方法。
hashCode()
Object类的方法:
public int hashCode():返回该对象的哈希码值。
哈希值是根据哈希算法算出来的一个值,这个值和地址有关,但是不是实际地址值。可以先理解为地址值。
以下有code测试。
如果对象的equals方法被重写,那么对象的HashCode方法也尽量重写。
equals()
public boolean equals(Object obj) :指示一些其他对象是否等于此。
注意:Object类里面的equals方法的参数是Object类型的对象。
equals方法比较的是引用类型,默认情况下,比较的是地址值.
我们可以根据具体情况自己重写该方法。
一般重写是自动生成,比较对象的成员变量值是否相同。右键generate—>equals()和hashcode()
//Student.java
package equals;
/**
* Created by cc on 2018/8/20.
*/
public class Student {
private String name;
private int age;
public Student() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
//equalsTest.java中:s1.equals(s2)
public boolean equals(Object obj) { //传参: 多态 Object obj= Student s2 //this= s1;
// return super.equals(obj);//自动生成的
//name是个字符串,是引用类型,String类里面有equals方法,比较字符串的内容是否相同
/*
if (this.name.equals(obj.name) && this.age == obj.age) {//报错。注意,我们要使用的name是学生类的特有成员变量
//应该向下转型
return true;
} else
return false;
*/
//正确的重写equals的方法
Student s= (Student)obj;//向下转型
if(this.name.equals(s.name) && this.age==s.age){
return true;
}
else{
return false;
}
//return this.name.equals(s.name) && this.age==s.age
}
}
这里写代码片package equals;
/**
* Created by cc on 2018/8/20.
*/
public class euqalsTest {
public static void main(String[] args){
Student s1 = new Student();
s1.setName("林青霞");
s1.setAge(27);
Student s2 = new Student();
s2.setName("林青霞");
s2.setAge(27);
//输出值
System.out.println(s1.getName()+"---"+s1.getAge());//林青霞---27
System.out.println("----------------------------");
System.out.println(s1==s2);//false
System.out.println(s1.equals(s2));//false this=s1; obj=s2 //Note: 重写为比较对象的成员变量后,这里输出为:true
Student s3= s1;
System.out.println(s1.equals(s3));//ture
Student s4 = new Student();
s4.setName("萧红");
s4.setAge(26);
System.out.println(s1.equals(s4));//false
}
}
优化刚写的equals方法:提高效率;提高健壮性。
如何判断某个对象是否是某个类的对象?
补充:instanceof关键字
例如:判断对象obj是否为Student类的对象:(obj instance Student)
public boolean equals(Object obj){// 调用s1.equals(s2) 多态:Object obj= Student s2; this= s1
//提高效率。自己和自己比较时候
if(this==obj){
return true;
}
//提高程序健壮性
//先判断一下,obj是不是Student的对象,如果是,再做向下转型,如果不是,直接返回flase
if(!(obj instanceof Student)){ //判断obj是不是Student类的对象
return false;
}
Student s= (Student)obj;
return this.name.equals(name) && this.age==s.age;
}
getClass()
public final Class getClass():返回Object的运行时类。
顺便了解一个Class类里的方法:public String getName():以String的形式返回此Class对象所表示的实体。
以下有code测试。
toString()
public String toString():返回该对象的字符串表示。
不重写的话,输出的信息没有什么意义。
建议所有子类都重写此方法:
idea下,右键,点击generate找到toString会自动重写。
直接输出一个对象的名称,其实就是调用toString()方法
package com.chen;
public class Student {
private String name;
private int age;
public Student(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//右键点generate..自动生成
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
package com.chen;
public class StudentTest {
public static void main(String[] args){
Student s1 = new Student();
s1.setName("林青霞");
s1.setAge(27);
//输出值
System.out.println(s1.getName()+"---"+s1.getAge());//林青霞---27
System.out.println("----------------------------");
System.out.println(s1.toString());//Student{name='林青霞', age=27}
System.out.println(s1);//Student{name='林青霞', age=27}
System.out.println(s1.hashCode());//输出了一个int值:1163157884
System.out.println(s1.getClass());//class com.chen.Student
String str= s1.getClass().getName();
System.out.println(str);//com.chen.Student
}
}
finalize()
protected void finalize():当垃圾回收器确定不存在该对象的更多引用时,由对象的垃圾回收器调用此方法。用于垃圾回事,但是什么时候调用去回收不确定。
clone()
protected Object clone():创建并返回此对象的副本
Cloneable:此类实现了Cloneable接口.