文章目录

  • 1、clone
  • 2、hashCode
  • 3、equals
  • 4、getClass
  • 5、finalize()



1、clone

java中的clone的方法是浅克隆方法,只能复制引用指向的堆内存

java 取对象obj的值 java怎么取object中的值_java 取对象obj的值

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是用来判断引用指向内存是否相等的函数

java 取对象obj的值 java怎么取object中的值_java 取对象obj的值

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已经废除。