Java——Object类

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); //java.lang.Object@de6ced

              //创建一个Person类型的对象

              Person p1 = new Person("刘德华",50);

              //调用toString方法.

              String pStr = p1.toString();

              System.out.println(pStr); //重写前:Person@lfb8ee3//后: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