2.6 Object类
①java.lang.Object 类,是所有类的根父类!
②如果在类的声明中未使用extends 关键字指明其基类,则默认基类为Object 类
③Object类仅有一个空参的构造器 public Object(){ }
2.5.1 toString方法
SUN在Object类中设计toString方法的目的:返回java对象的字符串表示形式。
在现实的开发过程中,Object里边的toString方法已经不够用了。因为Object的toString方法实现的结果不满意。Object中的toString方法就是要被重写的。
SUN是这样实现toString方法的:
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } |
Object中的toString方法返回:类名@java对象的内存地址经过哈希算法得出的int类型值再转换成十六进制。
这个输出结果可以等同看做java对象在堆中的内存地址。
public class Test01{ public static void main(String[] args){ //创建一个Object类型的对象. Object o1 = new Object(); //调用toString方法. String oStr = o1.toString(); System.out.println(oStr); //[email protected] //创建一个Person类型的对象 Person p1 = new Person("刘德华",50); //调用toString方法. String pStr = p1.toString(); System.out.println(pStr); //重写前:[email protected]//后:Person[name=刘德华,age=50] Person p2 = new Person("巩俐",50); System.out.println(p2.toString()); //Person[name=巩俐,age=50] //print方法后面括号中如果是一个引用类型,会默认调用引用类型的toString方法. System.out.println(p2); //Person[name=巩俐,age=50] } } class Person{ String name; int age; Person(String name,int age){ this.name = name; this.age = age; } //重写toString方法. //根据项目的需求而定。 //需求规定,显示格式:Person[name=刘德华,age=50] public String toString(){ return "Person[name="+name+",age="+age+"]"; } } |
【eclipse操作】
快速生成重写的toString 方法:Source à Generate toString()…
2.6.2 equals方法
Object中的equals方法:
public boolean equals(Object obj) { return (this == obj); } |
o1.equals(o2); o1是this,o2是obj
== 两边如果是引用类型,则比较内存地址,地址相同则是true,反之则false.
Object中的equals方法比较的是两个引用的内存地址。
java对象中的equals方法的设计目的:判断两个对象是否一样。
public class Test01{ public static void main(String[] args){ Object o1 = new Object(); Object o2 = new Object(); boolean b1 = o1.equals(o2); System.out.println(b1); //false Star s1 = new Star(100,"黄晓明"); Star s2 = new Star(100,"黄晓明"); Star s3 = new Star(110,"黄晓明"); System.out.println(s1.equals(s2)); //true System.out.println(s2.equals(s3)); //false } } class Star{ //身份证号 int id; //姓名 String name; //Constructor public Star(int id,String name){ this.id = id; this.name = name; } //Object中的equals方法比较的是内存地址. //在现实的业务逻辑当中,不应该比较内存地址,应该比较内容。 //所以Object中的equals方法也要重写。 //根据需求规定重写equals方法, //需求规定:如果身份证号一致,并且名字也一致,则代表是同一个人。 //s1.equals(s2); public boolean equals(Object obj){ if(this==obj) return true; if(obj instanceof Star){ Star s = (Star)obj; if(s.id == id && s.name.equals(name)){ return true; } } return false; } } |
/* 关于java语言中如何比较两个字符串是否一致. 在java中比较两个字符串是否一致,不能用“==” 只能调用String类的equals方法. */ public class Test02{ public static void main(String[] args){ String s1 = new String("ABC"); String s2 = new String("ABC"); System.out.println(s1==s2); //false //String已经重写了Object中的equals方法,比较的是内容。 System.out.println(s1.equals(s2)); //true } } |
【eclipse快捷方式】
快速生成重写的equals 方法:
Source àGenerate hashCode() and equals()…
2.6.3 finalize方法
垃圾回收器(Garbage Collection),也叫GC,垃圾回收器主要有以下特点:
①当对象不再被程序使用时,垃圾回收器将会将其回收
②垃圾回收是在后台运行的,我们无法命令垃圾回收器马上回收资源,但是我们可以
告诉他,尽快回收资源(System.gc 和Runtime.getRuntime().gc())
③垃圾回收器在回收某个对象的时候,首先会调用该对象的finalize 方法
④GC 主要针对堆内存
⑤单例模式的缺点
finalize方法什么时候调用?
①finalize方法每个java对象都有
②finalize方法不需要程序员去调用,由系统自动调用。
③java对象如果没有更多的引用指向它,则该java对象成为垃圾数据,等待垃圾回收器的回收,垃圾回收器在回收这个java对象之前会自动调用该对象的finalize方法。
④finalize方法是该对象马上就要被回收了,例如:需要释放资源,则可以在该方法中释放。
public class Test01{ public static void main(String[] args){ Person p1 = new Person(); p1 = null; //没有引用再指向它.等待回收. //程序员只能“建议”垃圾回收器回收垃圾. System.gc(); } } class Person{ //重写Object中的finalize方法. public void finalize() throws Throwable { System.out.println(this + "马上就要被回收了!"); //让引用再次重新指向该对象,该对象不是垃圾数据,不会被垃圾回收器回收! //Person p = this; } } |
2.6.4 hashCode方法
public class Test01{ public static void main(String[] args){ //hashCode方法返回的是该对象的哈希码值 //java对象的内存地址经过哈希算法得出的int类型的数值. Test01 t = new Test01(); System.out.println(t.hashCode()); //14576877 } } |
当垃圾收集器将要收集某个垃圾对象时将会调用finalize,建议不要使用此方法,因为此方法的运行时间不确定,如果执行此方法出现错误,程序不会报告,仍然继续运行。
public class FinalizeTest01 { public static void main(String[] args) { Person person = new Person(); person.id = 1000; person.name = "张三"; //将person 设置为null 表示,person 不再执行堆中的对象 //那么此时堆中的对象就是垃圾对象 //垃圾收集(GC)就会收集此对象 //GC 不会马上收集,收集时间不确定 //但是我们可以告诉GC,马上来收集垃圾,但也不确定,会马上来,也许不会来 person = null; System.gc();//通知垃圾收集器,来收集垃圾 /* try { Thread.sleep(5000); }catch(Exception e) { } */ } } class Person{ int id; String name; //此方法垃圾收集器会调用 public void finalize() throws Throwable { System.out.println("Person.finalize()"); } } |
注意以下写法
public class FinalizeTest02 { public static void main(String[] args) { method1(); } private static void method1() { Person person = new Person(); person.id = 1000; person.name = "张三"; //这种写法没有多大的意义, //执行完成方法,所有的局部变量的生命周期全部结束 //所以堆区中的对象就变成垃圾了(因为没有引用指向对象了) //person = null; } } class Person{ int id; String name; public void finalize() throws Throwable { System.out.println("Person.finalize()"); } } |
原文地址:https://www.cnblogs.com/superjishere/p/11819712.html