Object类
Object类中的方法是所有子类通用的,任何一个类都直接或间接继承Object类。可以查阅java类库(API)的帮助文档来查看Object类中的方法。
1 toString方法
-
toString()方法的作用是将”java对象“转换为”字符串“的形式
-
toString()方法的默认实现是:类名@对象的内存地址转换位十六进制形式
-
API帮助文档建议所有子类都重写此方法,重写原则:简单且详实
package com.objecthelp; public class MyTime { public static void main(String[] args) { // 实例化一个MyTime对象 MyTime t1 = new MyTime(1970,1,1); // 如果不重写toString方法,运行结果为 com.objecthelp.MyTime@1b6d3586 String str = t1.toString(); System.out.println(str); // 运行结果:1970年1月1日 } int year; int month; int day; // 重写toString方法 public String toString() { return this.year + "年" + this.month + "月" + this.day + "日"; } public MyTime() { } public MyTime(int year, int month, int day) { this.year = year; this.month = month; this.day = day; } }
-
System.out. println(引用);这里会自动调用“引用”的 toString()方法
-
String类重写了toString方法
2 equals方法
-
equals()方法的作用:equals方法是判断两个对象是否相等的
-
判断两个java对象是否相等,不能使用“==”,因为双等号比较的是两个对象的内存地址
-
在 Object类中的equals方法当中,默认采用的是“==”判断两个java对象是否相等,所以在子类中需要重写equals方法
-
String类重写了equals方法,比较两个字符串不能用“==”,要用equals方法,equals是通用的
package com.objecthelp; public class MyTime { public static void main(String[] args) { // 实例化一个MyTime对象 MyTime t1 = new MyTime(1970,1,1); // 如果不重写toString方法,运行结果为 com.objecthelp.MyTime@1b6d3586 String str = t1.toString(); System.out.println(str); // 运行结果:1970年1月1日 // 如果不重写equals方法,运行结果为false MyTime t2 = new MyTime(1970,1,1); System.out.println(t1.equals(t2)); } int year; int month; int day; // 重写toString方法 public String toString() { return this.year + "年" + this.month + "月" + this.day + "日"; } /* // 重写equals方法基本版 public boolean equals (Object obj) { int year1 = this.year; int month1 = this.month; int day1 = this.day; if (obj instanceof MyTime) { // 向下强转类型 MyTime mt = (MyTime)obj; int year2 = ((MyTime) obj).year; int month2 = ((MyTime) obj).month; int day2 = ((MyTime) obj).day; // 判断内容是否相等 if (year1 == year2 && month1 == month2 && day1 == day2) { return true; } } return false; } */ // 重写equals方法改进版 public boolean equals (Object obj) { // 如果obj为空,直接返回false if (obj == null) { return false; } // 如果obj不是MyTime类,直接返回false if (!(obj instanceof MyTime)) { return false; } // 如果obj和this保存的内存地址相同,直接返回true if (this == obj) { return true; } // 说明obj类型是MyTime,比较具体数值是否相等 MyTime obj1 = (MyTime) obj; if (this.year == obj1.year && this.month == obj1.month && this.day == obj1.day) { return true; } return false; } public MyTime() { } public MyTime(int year, int month, int day) { this.year = year; this.month = month; this.day = day; } }
-
结论:比较基本数据类型是否相等,使用“==”,比较引用数据类型是否相等,使用equals方法。
3 finalize方法
-
finalize()方法只有一个方法体,里面没有代码,而且这个方法是 protected修饰的。
-
finalize()方法的执行时机是:当一个java对象即将被垃圾回收器回收的时候,JVM的垃圾回收器GC负责调用finalize()方法,不需要程序员手动调用。
-
finalize()方法实际上是SUN公司为java程序员准备的一个时机:垃圾回收时机,finalize()方法的作用类似于静态代码块的作用,
static静态代码块
在类加载时刻执行,并且只执行一次。package com.objecthelp; public class FinalizeTest { public static void main(String[] args) { for (int i = 0; i < 100000; i++) { Person person = new Person(); person = null; } System.gc(); //建议启动GC,可能启动,也可能不启动 } } class Person { @Override protected void finalize() throws Throwable { System.out.println("即将被销毁!"); } }
4 hashCode方法
-
hashCode()方法不是抽象方法,带有 native关键字,底层调用c++程序
-
hashcode()方法返回的是哈希值,实际上是一个java对象的内存地址,经过哈希算法,得出的一个值,所以 hashcode()方法的执行结果可以等同看做一个java对象的内存地址
package com.objecthelp; public class HasnCodeTest { public static void main(String[] args) { Object o = new Object(); int hashCode1 = o.hashCode(); System.out.println(hashCode1); MyClass myClass = new MyClass(); int hashCode2 = myClass.hashCode(); System.out.println(hashCode2); } } class MyClass { } // 运行结果: 460141958 1163157884