Java常用类之Object类

 

基本作用:

  • 超类、基类,所有类的直接或间接父类,位于继承树的最顶层(食物链最顶端的男人)。

  • 任何类,如没有书写extends显示继承某个类,默认直接继承Object类,否则为间接继承。

  • Object类所定义的方法,是所有对象都具备的方法。

  • Object类型可以存储任何对象。

    • 作为参数,可以接受任何对象。

    • 作为返回值,可以返回任何对象。


常用方法:

方法名描述
public final Class<?> getClass() 返回此 Object 的运行时类。
public int hasCode() 返回该对象的哈希码值。
public String toString() 返回该对象的字符串表示。
public boolean equals(Object obj) 指示其他某个对象是否与此对象“相等”。
protected void finalize() throws Throwable 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

 

 

getClass()方法

 

  • public final Class<?> getClass(){}

  • 返回引用中存储的实际对象类型。

  • 应用:通常应用于判断两个引用中实际存储对象类型是否一只致。


package lesson01;

public class Student {
private String name;
private int age;

public Student(){

}

public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}

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;
}
}

 

 

package lesson01;

public class TestStudent {
public static void main(String[] args) {
Student s1 = new Student("aaa",20);
Student s2 = new Student("bbb",22);
//判断s1s2是不是同一个类型
Class class1 = s1.getClass();
Class class2 = s2.getClass();

if (class1 == class2){
System.out.println("s1s2属于同一个类型");
}else {
System.out.println("s1s2不属于同一个类型");
}

}
}

 

 

 

 

 

hashCode()方法

 

  • public int hasCode(){}

  • 返回该对象的哈希码值。

  • 哈希值根据对象的地址字符串数字使用hash算法计算出来的int类型的数值。

  • 一般情况下,相同对象返回相同哈希码

 

package lesson01;

public class Student {
private String name;
private int age;

public Student(){

}

public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}

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;
}
}

 

 

 

package lesson01;

public class TestStudent {
public static void main(String[] args) {
Student s1 = new Student("aaa",20);
Student s2 = new Student("bbb",22);

//hashCode方法
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
}
}

 

 

 

 

 

toString()方法

  • public String toString(){}

  • 返回该对象的字符串表示形式(表现形式)。

  • 可以根据程序需求重写该方法。如:展现对象各个属性值

  • 对象输出时,会调用Object类中的toString()方法打印

 

 

package lesson01;

public class TestStudent {
public static void main(String[] args) {
Student s1 = new Student("aaa",20);
Student s2 = new Student("bbb",22);

//ToString方法
System.out.println(s1.toString());
System.out.println(s2.toString());
}
}

 

 

 

 

 

我们看一下toString的源码:

 

 

 

 

 

我们重写toString的源码:

 

 

 

 

查看运行结果:

 

 

 

 

 

equals()方法

 

  • public boolean equals(Object obj){}

  • 默认实现为(this==obj),比较两个对象地址是否相同。

  • 可进行重写,比较两个对象的内容是否相同。

  • 在String类中已经实现好了此方法,所以用户可直接进行两个字符串对象的比较

 

package lesson01;

public class TestStudent {
public static void main(String[] args) {
Student s1 = new Student("aaa",20);
Student s2 = new Student("bbb",22);

//equals方法,判断两个对象是否相等
System.out.println(s1.equals(s2));

Student s4 = new Student("小明", 12);
Student s5 = new Student("小明", 12);
System.out.println(s4.equals(s5));
}
}

 

测试结果:

 

 

 

 

 

 

equals()方法覆盖步骤:

  • 比较两个引用是否指向同一个对象

  • 判断obj是否为null

  • 判断两个引用指向的实际对象类型是否一致

  • 强制类型转换

  • 依次比较各个属性值是否相同

 

 

重写equals()方法

 

package lesson01;

public class Student {
private String name;
private int age;

public Student(){
}

public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}

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;
}

/*public String toString(){
return name+":"+age;
}*/

@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}


//重写equals方法
@Override
public boolean equals(Object obj) {
//1、判断两个对象是否是同一个引用
if (this == obj) {
return true;
}
//2、判断obj是否null
if (obj==null){
return false;
}
//3、判断是否是同一类型
// 这个有点笨重,不太好
// if (this.getClass()==obj.getClass()){
// }
if (obj instanceof Student){
//4、强制类型转换,instanceof 可以判断对象是否是某种类型
Student s=(Student) obj;
//5、比较属性
if (this.name.equals(s.getName())&&this.age==s.getAge()){
return true;
}
}

return false;

}
}

 

测试结果:

 

 

 

 

 

 

finalize()方法

 

  • protected void finalize() throws Throwable{}

  • 当对象被判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收对列。

    • 垃圾对象:没有有效引用指向此对象时,为垃圾对象。

    • 垃圾回收:由GC销毁垃圾对象,释放数据存储空间。

    • 自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象。

    • 手动回收机制:使用System.gc();通知JVM执行垃圾回收。

 

重写finalize()方法:

 

@Override
protected void finalize() throws Throwable {
System.out.println(this.name+"对象被回收了");
}

 

 

 

 

 

package lesson01;

public class TestStudent {
public static void main(String[] args) {
Student s1 = new Student("aaa",20);
Student s2 = new Student("bbb",22);

//equals方法,判断两个对象是否相等
System.out.println(s1.equals(s2));

Student s4 = new Student("小明", 12);
Student s5 = new Student("小明", 12);
System.out.println(s4.equals(s5));
}
}

 

 

测试结果:

 

 

 

 

 

略微修改:

 

package lesson01;

public class TestStudent2 {
public static void main(String[] args) {
// Student s1 = new Student("aaa", 23);
// Student s2 = new Student("bbb", 23);
// Student s3 = new Student("ccc", 23);
// Student s4 = new Student("ddd", 23);
// Student s5 = new Student("eee", 23);

new Student("aaa", 23);
new Student("bbb", 23);
new Student("ccc", 23);
new Student("ddd", 23);
new Student("eee", 23);

//回收垃圾
System.gc();
System.out.println("回收垃圾");


}
}

 

测试结果:

 

 

 

 

再次运行:

 

 

总结

  1. 实际开发中的作用,由于Object类可以接收任意的引用数据类型,所以在很多的类库设计上都采用Object作为方法的参数,这样操作起来更方便。
  2. Object类中还有一些方法如wait()、notify()等通常用在线程上,本文未介绍,后期学习线程方面的知识再进行相应的补充。

 

posted @ 2022-08-04 15:25  屯子里唯一的架构师  阅读(443)  评论(0编辑  收藏  举报