Object类
-
超类,基类,所有类的直接或间接父类,位于继承树的最顶层
-
任何类,如没有书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承
-
Object类中所定义的方法,是所有对象都具备的方法
-
Object类型可以存储任何对象
-
作为参数,可接受任何存储对象
-
作为返回值,可返回任何对象
-
getClass()方法
public final Class<?> getClass(){}
返回引用中存储的实际对象类型
应用:通常用于判断两个引用中实际存储的对象类型是否一致
package objects;
public class TestObject {
public static void main(String[] args) {
Animal a = new Dog();
Animal b = new Cat();
if(a.getClass() == b.getClass()){
System.out.println("对象类型一样");
}else{
System.out.println("对象类型不一样");
};
}
}
class Cat extends Animal{};
class Dog extends Animal{};
class Animal{};
hashCode()方法
-
public int hashCode(){}
-
返回改对象的十进制的哈希码值
-
哈希算法根据对象的地址或字符串或数字计算出来的int类型的数值
-
哈希码并不唯一,可保证相同对象返回相同哈希码,尽量保证不同对象返回不同哈希码
package objects;
public class TestHashCode {
public static void main(String[] args) {
for (int i=0;i<3;i++){
Object obj = new Object();
System.out.println(obj.hashCode()+"\t"+obj);
}
}
}
toString()方法
-
public String toString(){}
-
返回该对象的字符串表示(表现形式)
-
可以根据程序需求覆盖该方法,如:展示对象各个属性值
package objects; public class TestHashCode { public static void main(String[] args) { /* for (int i=0;i<3;i++){ Object obj = new Object(); System.out.println(obj.hashCode()+"\t"+obj); }*/ Teacher t = new Teacher("A",10); System.out.println(t.toString()); } } class Teacher{ String name; int age; public Teacher(String name,int age){ super(); this.name = name; this.age = age; } @Override public String toString() { return "Teacher{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
equals()方法
-
public boolean equals(Object obj){}
-
默认实现为(this == obj),比较两个对象地址是否相同
-
可进行覆盖,比较两个对象的内容是否相同
equals()方法覆盖步骤
-
比较两个引用是否指向同一个对象
-
判断obj是否为null
-
判断两个引用指向的实际对象类型是否一致
-
强制类型转换
-
依次比较各个属性是否相同
package objects;
import java.util.Objects;
public class TestEquals {
public static void main(String[] args) {
/*Object o1 = new Object();
Object o2 = new Object();
System.out.println(o1.equals(o2));
System.out.println(o1 == o2);*///无法人为干预
Student s1 = new Student("a",10,"男",99D);
Student s2 = new Student("a",11,"男",99D);
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
}
}
class Student{
String name;
int age;
String sex;
double score;
public Student(String name, int age, String sex, double score) {
this.name = name;
this.age = age;
this.sex = sex;
this.score = score;
}
//Student类下重写equals方法
@Override
public boolean equals(Object o){
//如果为同一个对象,则返回true
if(this == o){return true;}
//如果对象为空,返回false
if(null == o){return false;}
//如果引用对象类型不同,返回false
if(this.getClass() != o.getClass()){return false;}
//强制类型转换
Student stu = (Student)o;
//使用this的各个属性与o的各个属性值一一进行比较,如果所有属性完全相同,则代表二者相同
if(this.name.equals(stu.name) && this.age == stu.age &&
this.score ==stu.score && this.sex.equals(stu.sex) )
{return true;}
return false;
}
/*public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Student)) return false;
Student student = (Student) o;
return age == student.age &&
Double.compare(student.score, score) == 0 &&
Objects.equals(name, student.name) &&
Objects.equals(sex, student.sex);
}*/
/* @Override
public int hashCode() {
return Objects.hash(name, age, sex, score);
}*/
/*
public boolean equals(Object o){
o = new Student(name,age,sex,score);
if(this.name == ((Student) o).name){
return true;
}else{
return false;
}
}*/
}
finalize()方法
-
当对象被判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列
-
垃圾对象:没有有效引用指向此对象时,为垃圾对象
-
垃圾回收:由GC销毁垃圾对象,释放数据存储空间
-
自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象
-
手动回收机制:使用System.gc();通知JVM执行垃圾回收