标签:ash 回车 结果 rgs equals nali lan 场景 this
java.lang.Object类是类层次结构的根(父)类。每个类(Person,Student...)都使用 Object 作为超(父)类。所有对象(包括数组)都实现这个类的方法。
public class MyClass /*extends Object*/ { // ... }
根据JDK源代码及Object类的API文档,Object类当中包含的方法有11个。
toString方法:public String toString()
覆盖重写 :如果不希望使用toString方法的默认行为,则可以对它进行覆盖重写。在IntelliJ IDEA中,可以点击 Code 菜单中的 Generate... ,也可以使用快捷键 alt+insert ,点击 toString() 选 项。选择需要包含的成员变量并确定。举例:
public class Person { private String name; private int age; @Override public String toString() { return "Person{" + "name=‘" + name + ‘\‘‘ + ", age=" + age + ‘}‘; } // 省略构造器与Getter Setter }
equals方法 :public boolean equals(Object obj) :指示其他某个对象是否与此对象“相等”。SUN公司设计equals方法的目的是什么?以后编程的过程当中,都要通过equals方法来判断两个对象是否相等。equals方法是判断两个对象是否相等的。调用成员方法equals并指定参数为另一个对象,则可以判断这两个对象是否是相同的。这里的“相同”有默认和自定义两种方式。
默认地址比较
对象内容比较
重写equals方法的场景:
大多数IDE都可以自动生成equals方法的代码内容。在IntelliJ IDEA中,可以使用 Code 菜单中的 Generate… 选项,也可以使用快捷键 alt+insert ,并选择 equals() and hashCode() 进行自动代码生成。举例:
import java.util.Objects; public class Person { private String name; private int age; @Override public boolean equals(Object o) { // 如果对象地址一样,则认为相同 if (this == o) return true; // 如果参数为空,或者类型信息不一样,则认为不同 if (o == null || getClass() != o.getClass()) return false; // 转换为当前类型 Person person = (Person) o; // 要求基本类型相等,并且将引用类型交给java.util.Objects类的equals静态方法取用结果 return age == person.age && Objects.equals(name, person.name); } }
小结:
finalize方法
垃圾回收器(Garbage Collection),也叫 GC,垃圾回收器主要有以下特点:
/* 关于Object类中的finalize()方法。 1、在Object类中的源代码: protected void finalize() throws Throwable { } GC:负责调用finalize()方法。 2、finalize()方法只有一个方法体,里面没有代码,而且这个方法是protected修饰的。 3、这个方法不需要程序员手动调用,JVM的垃圾回收器负责调用这个方法。 不像equals toString,equals和toString()方法是需要你写代码调用的。 finalize()只需要重写,重写完将来自动会有程序来调用。 4、finalize()方法的执行时机: 当一个java对象即将被垃圾回收器回收的时候,垃圾回收器负责调用 finalize()方法。 5、finalize()方法实际上是SUN公司为java程序员准备的一个时机,垃圾销毁时机。 如果希望在对象销毁时机执行一段代码的话,这段代码要写到finalize()方法当中。 6、静态代码块的作用是什么? static { .... } 静态代码块在类加载时刻执行,并且只执行一次。 这是一个SUN准备的类加载时机。 finalize()方法同样也是SUN为程序员准备的一个时机。 这个时机是垃圾回收时机。 7、提示: java中的垃圾回收器不是轻易启动的, 垃圾太少,或者时间没到,种种条件下, 有可能启动,也有可能不启动。 */ public class Test06{ public static void main(String[] args){ /* // 创建对象 Person p = new Person(); // 怎么把Person对象变成垃圾? p = null; */ // 多造点垃圾 for(int i = 0; i < 1000; i++){ Person p = new Person(); p = null; // 有一段代码可以建议垃圾回收器启动。 if(i % 2 == 0){ System.gc(); // 建议启动垃圾回收器。(只是建议,可能不启动,也可能启动。启动的概率高了一些。) } } } } // 项目开发中有这样的业务需求:所有对象在JVM中被释放的时候,请记录一下释放时间!!! // 记录对象被释放的时间点,这个负责记录的代码写到哪里? // 写到finalize()方法中。 class Person{ // 重写finalize()方法 // Person类型的对象被垃圾回收器回收的时候,垃圾回收器负责调用:p.finalize(); protected void finalize() throws Throwable { // this代表当前对象 System.out.println(this + "即将被销毁!"); } }
hashCode方法:public native int hashCode(); 这个方法不是抽象方法,带有native关键字,底层调用C++程序。hashCode()方法返回的是哈希码:实际上就是一个java对象的内存地址,经过哈希算法,得出的一个值。所以hashCode()方法的执行结果可以等同看做一个java对象的内存地址。
public class Test07{ public static void main(String[] args){ Object o = new Object(); int hashCodeValue = o.hashCode(); // 对象内存地址经过哈希算法转换的一个数字。可以等同看做内存地址。 System.out.println(hashCodeValue); //798154996 MyClass mc = new MyClass(); int hashCodeValue2 = mc.hashCode(); System.out.println(hashCodeValue2); //1392838282 MyClass mc2 = new MyClass(); System.out.println(mc2.hashCode()); // 523429237 } } class MyClass { }
标签:ash 回车 结果 rgs equals nali lan 场景 this
原文地址:https://www.cnblogs.com/wurengen/p/13264640.html