Object类,又称超类、基类,位于继承树的最顶层。
任何类,如果没有书写extend显示继承某个类,都默认继承Object类。
Object类中所定义的方法,是所有对象所具备的方法be
Object类可以存储任何对象
- 作为参数,可接受任何对象。
- 作为返回值,可以返回任何对象。
Object类的API文档:
大致可以包含上述的那些方法。
1.getClass方法
它返回引用存储类型的实际对象类型:
通常用于判断两个引用中的实际存储对象的类型是否一致。(就是判断两个对象的类是否一致)
新建一个Student类,并进行封装和添加有参构造方法:
package com.classes.objec;
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;
}
}
主方法:利用getClass判断是否为同一类型
public class Test {
// getClass返回实际对象的类型
public static void main(String[] args) {
System.out.println("=================1.getClass====================");
Student s1 = new Student("aaa", 20);
Student s2 = new Student("bbb", 18);
Class aClass = s1.getClass();
Class bClass = s2.getClass();
System.out.println(aClass);
System.out.println(bClass);
if(aClass==bClass){
System.out.println("s1和s2是同一种类型");
}else {
System.out.println("s1和s2不是同一种类型");
}
}
}
运行结果:
2.hasCode方法:
顾名思义。它返回的是对象的haCode值。
哈希值是根据对象地址或字符串或数字使用hash算法计算出来的int类型的数值。
看看例子:
还是上面的Student和Test方法:
package com.classes.objec;
public class Test {
// getClass返回实际对象的类型
public static void main(String[] args) {
System.out.println("=================1.getClass====================");
Student s1 = new Student("aaa", 20);
Student s2 = new Student("bbb", 18);
Class aClass = s1.getClass();
Class bClass = s2.getClass();
System.out.println(aClass);
System.out.println(bClass);
if(aClass==bClass){
System.out.println("s1和s2是同一种类型");
}else {
System.out.println("s1和s2不是同一种类型");
}
// 2.hashcode 哈希值
System.out.println("=================2.hashcode====================");
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
Student s3 = s1;
System.out.println(s3.hashCode());
}
}
输出结果:
3.toString方法:
返回的是对象的字符串表示(十六进制):
还是Test类:
public class Test {
// getClass返回实际对象的类型
public static void main(String[] args) {
System.out.println("=================1.getClass====================");
Student s1 = new Student("aaa", 20);
Student s2 = new Student("bbb", 18);
Class aClass = s1.getClass();
Class bClass = s2.getClass();
System.out.println(aClass);
System.out.println(bClass);
if(aClass==bClass){
System.out.println("s1和s2是同一种类型");
}else {
System.out.println("s1和s2不是同一种类型");
}
// 2.hashcode 哈希值
System.out.println("=================2.hashcode====================");
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
Student s3 = s1;
System.out.println(s3.hashCode());
// 3.toString 返回的是一个十六进制的哈希值
System.out.println("=================3.toString====================");
System.out.println(s1.toString());
System.out.println(s2.toString());
}
}
输出结果:
两个看不懂得字符串,但是我们可以通过重写toString方法来实现显示对象的各个属性值。
Student类:
package com.classes.objec;
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;
}
// 重写toString方法
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
重写后的运行结果:
完美。
4.equlas方法
它用于比较两个对象的地址是否相同:
package com.classes.objec;
public class Test {
// getClass返回实际对象的类型
public static void main(String[] args) {
System.out.println("=================1.getClass====================");
Student s1 = new Student("aaa", 20);
Student s2 = new Student("bbb", 18);
Class aClass = s1.getClass();
Class bClass = s2.getClass();
System.out.println(aClass);
System.out.println(bClass);
if(aClass==bClass){
System.out.println("s1和s2是同一种类型");
}else {
System.out.println("s1和s2不是同一种类型");
}
// 2.hashcode 哈希值
System.out.println("=================2.hashcode====================");
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
Student s3 = s1;
System.out.println(s3.hashCode());
// 3.toString 返回的是一个十六进制的哈希值
System.out.println("=================3.toString====================");
System.out.println(s1.toString());
System.out.println(s2.toString());
// 4.equals 判断两个对象是否相对,返回的是一个布尔值
System.out.println("=================4.equals====================");
System.out.println(s1.equals(s2));
Student s4 = new Student("小明", 17);
Student s5 = new Student("小明", 17);
System.out.println(s4.equals(s5));
// 如何用equals来判断两个对象的属性是否相等?重写equals方法
}
}
运行结果返回一个布尔值
问:如何用equals来判断两个对象的属性是否相等?
这个需要我们再来重写equals方法。
分为5步走
- 比较两个对象是否是同一个引用
- 判断obj类是否为null
- 判断两个对象的类型是否相同
- 强制进行类型转换
- 对属性进行逐个比较
看代码
Student类 :
package com.classes.objec;
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;
}
// 重写toString方法
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
// 重写equals方法,使得它可以用于比较两个对象的属性是否相等,IDEA可以直接输入equal进行重写
@Override
public boolean equals(Object o) {
// 1判断两个对象是否是同一个引用
if(this==o){
return true;
}
// 2判断obj是否为null
if(o==null){
return false;
}
// 3判断对象是否是同一种类型
if(o instanceof Student){
// 4强制类型转换
Student student = (Student)o;
// 5进行属性比较
if(this.name == student.name&& this.age == student.age){
return true;
}
}
return false;
}
}
IDEA可以直接输入equals进行重写。
再运行一次主方法,得到输出结果:
5.finalize方法:
回收垃圾对象的方法,由JVM自动调用此方法。
垃圾一般分为 四种:
现在Student类中重写finalize方法:
package com.classes.objec;
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;
}
// 重写toString方法
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
// 重写equals方法,使得它可以用于比较两个对象的属性是否相等,IDEA可以直接输入equal进行重写
@Override
public boolean equals(Object o) {
// 1判断两个对象是否是同一个引用
if(this==o){
return true;
}
// 2判断obj是否为null
if(o==null){
return false;
}
// 3判断对象是否是同一种类型
if(o instanceof Student){
// 4强制类型转换
Student student = (Student)o;
// 5进行属性比较
if(this.name == student.name&& this.age == student.age){
return true;
}
}
return false;
}
// 重写finalize方法,好像是一个抛出异常
@Override
protected void finalize() throws Throwable {
System.out.println(this.name+"被回收了");
}
}
重新写一个主方法,创建5个对象:
public class Test2 {
// finalize 垃圾对象回收
public static void main(String[] args) {
Student s1 = new Student("aaa", 17);
Student s2 = new Student("bbb", 18);
Student s3 = new Student("ccc", 19);
Student s4 = new Student("ddd", 20);
Student s5 = new Student("eee", 21);
System.gc();
System.out.println("被回收了");
}
}
运行结果:
没有执行finnalize方法。
当我们把对象名去掉的时候:
package com.classes.objec;
public class Test2 {
// finalize 垃圾对象回收
public static void main(String[] args) {
// Student s1 = new Student("aaa", 17);
// Student s2 = new Student("bbb", 18);
// Student s3 = new Student("ccc", 19);
// Student s4 = new Student("ddd", 20);
// Student s5 = new Student("eee", 21);
new Student("aaa", 17);
new Student("bbb", 18);
new Student("ccc", 19);
new Student("ddd", 20);
new Student("eee", 21);
System.gc();
System.out.println("被回收了");
}
}
执行了finalize方法