Object类
在学习继承时,IDEA里面又快捷键Ctrl+H
展开子父类继承关系。很容易发现,所有我们自建的类都默认继承Object类,因此成员变量都可以使用Object类中的方法。
0bject类中所定义的方法,是所有对象都具备的方法。
0bject类可以存储任何对象。作为参数,可接受任何对象;作为返回值,可返回任何对象。
具体哪些方法都可以在JDK API里面看,建议立马搜索或者下载一个。
getClass()方法
- 函数定义:public final Class<?> getClass() {}
返回引用中存储的实际对象类型。 - 使用
Class c1 = m1.getClass();
- 返回的是Class对象,目前简单理解:每当编写并且编译一个新创建的类就会产生一个对应Class对象并且这个Class对象会被保存在同名.class文件里(编译后的字节码文件保存的就是Class对象)。无论创建多少个实例对象,在JVM中都只有一个Class对象,即在内存中每个类有且只有一个相对应的Class对象
参考:深入理解Java类型信息(Class对象)与反射机制 - 应用:通常用于判断两个引用中实际存储对象类型是否一致。
hashCode()方法
- 函数定义public int hashCode() {}
返回该对象的哈希码值。 - 使用
int n1 = m1.hashCode();
- 哈希值根据对象的地址或字符串或数字使用hash算法计算出来的int类型的数值。
一般情况下相同对象返回相同哈希码。
toString()方法
-
函数定义:public String toString() {}
返回该对象的字符串表示(默认表现形式:类的名称+@+把一个hashcode的值转成16进制的数字)。 -
使用
String s1 = m1.toString();
-
可以根据程序需求覆盖该方法【重写】,如:展示对象各个属性值
@Override //快捷键【Alt+insert】→toString
public String toString() { //重写toString方法
return "Member{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
equals()方法
- 函数定义:public boolean equals(Object obj){}
返回一个布尔值。默认实现为(this == obj),比较两个对象地址是否相同。 - 使用
boolean judge = m2.equals(m3)
- 可进行覆盖,重写了父类的方法,例如比较两个对象的内容是否相同。
@Override //快捷键【Alt+insert】→equals()and hashCode()
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Member)) return false;
Member member = (Member) o;
return age == member.age &&
Objects.equals(name, member.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
手工equals()方法覆盖步骤:
- 比较两个引用是否指向同一个对象。
- 判断obj是否为null。
- 判断两个引用指向的实际对象类型是否一致。
- 强制类型转换。
- 依次比较各个属性值是否相同。
@Override
public boolean equals(Object obj) {
//1判断两个对象是否是同一个引用
if (this == obj) {
return true;
}
//2判断obj是否null
if (obj == null) {
return false;
}
//3判断是否是同一个类型
if (obj instanceof Member) {
//4强制类型转换
Member s = (Member) obj;
//5比较熟悉
if (this.name.equals(s.getName()) && this.age == s.getAge()) {
return true;
}
}
return false;
}
finalize()方法
- 当对象被判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列。
- 垃圾对象“没有有效引用指向此对象时,为垃圾对象。
- 垃圾回收:由GC销毁垃圾对象,释放数据存储空间。
- 自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象。
- 手动回收机制:使用
System.gc();
通知JVM执行垃圾回收。
package study.object;
/* //Member.java存放Member类
package study.object;
import java.util.Objects;
public class Member {
String name;
int age;
public String getName() {
return name;
}
public int getAge() {
return age;
}
//【Alt+insert→构造函数】
public Member(String name, int age) {
this.name = name;
this.age = age;
}
@Override //快捷键【Alt+insert】→toString
public String toString() { //重写toString方法
return "Member{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
// @Override //快捷键【Alt+insert】→equals()and hashCode()
// public boolean equals(Object o) {
// if (this == o) return true;
// if (!(o instanceof Member)) return false;
// Member member = (Member) o;
// return age == member.age &&
// Objects.equals(name, member.name);
// }
//
// @Override
// public int hashCode() {
// return Objects.hash(name, age);
// }
@Override
public boolean equals(Object obj) {
//1判断两个对象是否是同一个引用
if (this == obj) {
return true;
}
//2判断obj是否null
if (obj == null) {
return false;
}
//3判断是否是同一个类型
if (obj instanceof Member) {
//4强制类型转换
Member s = (Member) obj;
//5比较熟悉
if (this.name.equals(s.getName()) && this.age == s.getAge()) {
return true;
}
}
return false;
}
@Override
protected void finalize() throws Throwable {
System.out.println(this.name+"对象被回收。。。");
}
}
*/
public abstract class mainText {
public static void main(String[] args) {
//创建对象
Member m1 = new Member("张三",22);
Member m2 = new Member("王五", 20);
Member m3 = new Member("王五", 20);
System.out.println("1.getclass()判断对象是否属于同一类型");
Class c1 = m1.getClass();
System.out.println("对象类型:"+c1);
System.out.println("对象是否属于同类型:"+(m1.getClass()==m2.getClass()));
System.out.println("2.hashCode()返回对象哈希码");
int n1 = m1.hashCode();
System.out.println("m1哈希码:"+n1);
System.out.println("m2哈希码:"+m2.hashCode());
System.out.println("3.重写toString()返回该对象的字符串表示");
String s1 = m1.toString();
System.out.println("m1字符串表示:"+s1);
System.out.println("4.重写equals()判断对象值是否相等");
boolean judge = m2.equals(m3);
System.out.println("对象值是否相等:"+judge);
System.out.println("5.finalize()手动回收机制");
new Member("w1",22); //快捷键【Ctrl+D】复制到下一行
new Member("w2",22);
new Member("w3",22);
System.gc(); //通知JVM执行垃圾回收
System.out.println("回收");
}
}
/*
1.getclass()判断对象是否属于同一类型
对象类型:class study.object.Member
对象是否属于同类型:true
2.hashCode()返回对象哈希码
m1哈希码:1163157884
m2哈希码:1956725890
3.重写toString()返回该对象的字符串表示
m1字符串表示:Member{name='张三', age=22}
4.重写equals()判断对象值是否相等
对象值是否相等:true
5.finalize()手动回收机制
回收
w对象被回收。。。
w对象被回收。。。
w对象被回收。。。
*/