常用类-Object类
Object类
概念
- 超类、基类,所有类的直接或间接父类,位于继承树的最顶层。
- 任何类,如果没有书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承。
- Object类中所定义的方法,是所有对象都具备的方法。
- Object类型可以存储任何对象。
- 作为参数,可接受任何对象。
- 作为返回值,可返回任何对象。
方法摘要
JDK官方文档中的方法摘要
方法介绍
这里只讲getClass()
、equals()
、hashCode()
、toString()
、finalize()
这5个方法,其他方法后面用到了再讲
getClass()
-
源码,返回值为
Class
public final Class<?> getClass(){}
-
返回引用中存储的实际对象类型
-
应用:通常用于判断两个引用中实际存储对象类型是否一致
-
学生类
package com.ciao.classDemo.demo01; public class Student { private String name; private int age; public Student(String name, int age) { 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 com.ciao.classDemo.demo01; public class Test { public static void main(String[] args) { //创建实例 Student s1 = new Student("言身寸", 23); Student s2 = new Student("雨山夆", 23); //获取实例存储对象的类型 Class s1Class = s1.getClass(); Class s2Class = s2.getClass(); //判断是否一致 Boolean flag = s1Class==s2Class; System.out.println("s1与s2类型是否一致?"+ flag); } }
-
hashCode()
-
源码,返回值为
int
public int hashCode(){}
-
返回该对象的哈希码值
-
哈希值根据对象的地址或字符串或数字使用hash算法计算出来的Int类型的数值
-
一般情况下相同对象返回相同哈希码
接上一个实例
package com.ciao.classDemo.demo01; public class Test { public static void main(String[] args) { //创建实例 Student s1 = new Student("言身寸", 23); Student s2 = new Student("雨山夆", 23); //获取实例的哈希值,int类型 int s1Hash = s1.hashCode(); int s2Hash = s2.hashCode(); //判断哈希值是否一致 Boolean flag2 = s1Hash==s2Hash; System.out.println("s1:"+s1Hash+"与s2:"+s2Hash+"是否一致?"+ flag2); //新建一个实例s3等于s1,发现s3的哈希值与s1一致,指向地址一致 Student s3 = s1; System.out.println(s3.hashCode()); } }
输出
s1:1735600054与s2:21685669是否一致?false 1735600054
toString()
-
源码
类型为
String
,返回值包括类名+@+哈希值十六进制public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
-
返回该对象的字符串表示(表示形式,类名字+哈希值十六进制),可重写该方法,变成你想要的字符串形式(展示对象的各个属性值)
-
未重写返回值
代码
System.out.println(s1.toString()); System.out.println(s2.toString());
输出
com.ciao.classDemo.demo01.Student@677327b6 com.ciao.classDemo.demo01.Student@14ae5a5
-
重写后返回对象的各个属性
这里使用快捷重写
@Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; }
代码
System.out.println(s1.toString()); System.out.println(s2.toString());
输出
Student{name='言身寸', age=23} Student{name='雨山夆', age=23}
-
equals()
-
源码
返回值类型为
boolean
值,判断两个对象指向的地址是否一致public boolean equals(Object obj) { return (this == obj); }
-
可进行重写,比较两个值的内容是否相同
-
未重写,输出为
false
package com.ciao.classDemo.demo01; public class Test { public static void main(String[] args) { //创建实例 Student s1 = new Student("雨山夆", 23); Student s2 = new Student("雨山夆", 23); //判断两个内容一样的对象是否相等 System.out.println(s1.equals(s2)); } }
-
重写后再比较,输出为
true
@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){//instanceof 判断对象是否是某种类型 //4.强制类型转换 Student s = (Student) obj; //5.依次比较各个属性值是否相等 if(this.name.equals(s.getName())&&(this.age==s.getAge())){ return true; } } return false; }
-
-
equals()
与==
的区别
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 com.ciao.classDemo.demo01; public class Test { public static void main(String[] args) { //创建实例 Student s1 = new Student("aaa", 1); Student s2 = new Student("bbb", 1); new Student("ccc", 1); //回收垃圾 System.gc(); System.out.println("已执行回收垃圾!"); } }
输出
com.ciao.classDemo.demo01.Test 已执行回收垃圾! ccc被回收了~ Process finished with exit code 0
-
欲买桂花同载酒,终不似,少年游~