文章目录
- 1、clone
- 2、hashCode
- 3、equals
- 4、getClass
- 5、finalize()
1、clone
java中的clone的方法是浅克隆方法,只能复制引用指向的堆内存
Person p1 = new Person(23, "zhang");
Person p2 = (Person) p.clone();
实际上我们只是将p1指向的堆内存A复制了一遍,而在A内有字符串name,所以实际上A中包含的是字符串name的地址,也就是C的地址,所以在进行使用clone进行复制的时候是将A复制了一遍形成了B,所以p1,p2实际上是公用字符串name的。
这里还有一篇详解,博主写的很详细很好,如果看不懂我说的可以看看这个博主的
2、hashCode
public class Main {
public static void main(String[] args) {
String i ="hashCode";
System.out.println(i.hashCode());
}
}
输出:147696667
hashCode()方法是java对象的内存地址经过哈希算法得出的一个整数值(int)
3、equals
equals是用来判断引用指向内存是否相等的函数
boolean result = p1.equals(p2);
比较的是p1中存储的内存地址指向的内存中的数据和p2中存储的内存地址指向的内存中的数据,实际上是比较A、B两块内存中的数据(但是由于这里这个person是我们自己定义的,所以在进行equals比较的时候需要重写hashCode()函数,不过这个不重要)
这里在顺便提一下“==”,和equals不同的是"=="比较适合p1中存储的内存地址是否和p2中存储的内存地址是否相同。
4、getClass
String i="1";
System.out.println(i.getClass());
输出是:class java.lang.String
getClass 输出的是实例的运行时类(后边解什么叫运行时类),由于除了基本类型(int short long boolean float double byte char)外其他的类都是Object的子类,也就都可以调用getClass
例如 :
public class Person {
int age=10;
public Person() {
}
public Person(int age) {
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
Person i = new Person();
System.out.println(i.getClass());
}
}
输出:class Person
运行时类: java的实例有运行时类和编译类两种,具体原理就不说了,运行时类型是真正的实例类型(Student),编译型类型是声明类型(Person)
java Person person = new student();
5、finalize()
finalize()方法是GC(垃圾回收)来调用的,当GC启动要进行垃圾回收,即销毁对象的时候会调用对象的finalize()方法,所以如果我们想要输出/记录每个对象被回收的时间等可以重写finalize()方法,但是该方法自java9已经废除。