首页 > 技术文章 > Java中Object类常用方法

hty20010101 2021-12-01 15:08 原文

Object类常用方法

JDK类库的根类:Object

1、这个老祖宗类中的方法我们需要先研究一下,因为这些方法都是所有子类通用的。

任何一个类默认继承Object。就算没有直接继承,最终也会间接继承。

 

2、Object类当中有哪些常用的方法?

  我们去哪里找这些方法呢?

  第一种方法:去源代码当中。(但是这种方式比较麻烦,源代码也比较难)

  第二种方法:去查阅java的类库的帮助文档。

 

  什么是API?

  应用程序编程接口。(Application Program Interface)

  整个JDK的类库就是一个javase的API。

  每一个API都会配置一套API帮助文档。

  SUN公司提前写好的这套类库就是API。(一般每一份API都对应一份API帮助文档。)

 

  目前为止我们只需要知道这几个方法即可:

    protected Object clone() // 负责对象克隆的。

    int hashCode() // 获取对象哈希值的一个方法。

    boolean equals(Object obj) // 判断两个对象是否相等

    String toString() // 将对象转换成字符串形式

    protected void finalize() // 垃圾回收器负责调用的方法

 


 

3、toString()方法

  1.源代码长什么样?

  public String toString() {

    returnthis.getClass().getName() +"@"+Integer.toHexString(hashCode());

  }

  2.源代码上toString()方法的默认实现是:

    类名@对象的内存地址转换为十六进制的形式

  3.toString()**方法的作用是什么?**

    toString()方法的设计目的是:通过调用这个方法可以将一个“java对象”转换成“字符串表示形式”

  4.其实SUN公司开发java语言的时候,建议所有的子类都去重写toString()方法。

    toString()方法应该是一个简洁的、详实的、易阅读的.

    eg.

     public String toString(){
      return this.year + "年" + this.month + "月" + this.day + "日";
     }

    以后所有类的toString()方法是需要重写的。

    重写规则:越简单越明了就好。

 

  5.System.out.println(引用); 这里会自动调用“引用”的toString()方法

     //Student为一个类
     System.out.println(Student.toString());

     和

     System.out.println(Student);

     输出结果一样,省略”.toString()“编译器会自动补上!

 

  6.String类是SUN写的,toString()和equals()方法已经重写了。

 


 

4、equals()方法

  1.equals方法的源代码

    public boolean equals(Object obj) {

      return (this == obj);

    }

 

  2.SUN公司设计equals方法的目的是什么?

    equals方法是 判断两个对象是否相等。

 

  3.研究一下Object类给的这个默认的equals方法够不够用

    在Object类中的equals方法当中,默认采用的是“== ”判断两个java对象是否相等。

    而“ ==”判断的是两个java对象的 内存地址,

    我们应该判断两个java对象的内容是否相等。所以老祖宗的equals方法不够用,需要子类重写equals。

 

    注:判断两个java对象内容是否相等,不能使用“== ”,因为“==”比较的是两个对象的内存地址。

 

    基本数据类型,判断相等用“==”;

     public class Test{
        static void main(String[] args){
             int a = 10;
             int b = 10;
            System.out.println(a == b);//true
         }
     }    

    引用数据类型,判断相等必须重写equals()方法,不然比较的是内存地址。

     public class Test{
        static void main(String[] args){
        MyTime t1 = new MyTime(2008, 8, 8);
         //MyTime t1 = 0x1234;
        // 创建了一个新的日期对象,但表示的日期也是:2008年8月8日。
        MyTime t2 = new MyTime(2008, 8, 8); //MyTime t2 = 0x3698;
        System.out.println(t1 == t2);//false
        }
     }

  4.equals()方法怎么重写?

    eg.

     public boolean equals(Object obj) {
        if(obj == null || !(obj instanceof MyTime)){
        return false;
      }
        if(this == obj){
         return true;
         }
        MyTime t = (MyTime)obj;//向下转型,因为Object里面没有year month day。
        return this.year == t.year && this.month == t.month && this.day == t.day ;
     }

  5.以后所有类的equals方法也需要重写,因为Object中的equals方法比较的是两个对象的内存地址,我们应该比较内容,所以需要重写。

    重写规则:自己定,主要看是什么和什么相等时表示两个对象相等。

    基本数据类型比较实用:==

    对象和对象比较:调用equals方法

 

  6.String类是SUN编写的,所以String类的equals方法重写了。以后判断两个字符串是否相等,最好不要使用==,要调用字符串对象的equals方法。

    eg.

     userName = args[0];
     if (userName.equals("admin")){
      ....
     }
 

    上面这种写法可能出现空指针异常,建议采用以下写法

     userName = args[0];
     if ("admin".equals(userName)){
      ....
     }

  7.注意:

    以后自己写的类equals()方法必须重写!!

    equals方法重写的时候要彻底!!!即每个类都要重写

 


5、finalize()方法(已经被淘汰)。

  1.在Object类中的源代码:

   protected void finalize() throws Throwable { }

  GC:负责调用finalize()方法。

 

  2.finalize()方法只有一个方法体,里面没有代码,而且这个方法是protected修饰的。

 

  3.这个方法不需要程序员手动调用,JVM的垃圾回收器负责调用这个方法。

    finalize()只需要重写,重写完将来自动会有程序来调用。

 

  4.finalize()方法的执行时机:

    当一个java对象即将被垃圾回收器回收的时候,垃圾回收器负责调用finalize()方法。

 

  5、finalize()方法实际上是SUN公司为java程序员准备的一个时机,垃圾销毁时机。

    如果希望在对象销毁时机执行一段代码的话,这段代码要写到finalize()方法当中。

 

  6、静态代码块的作用是什么?

    static {

    ....

    }

    静态代码块在类加载时刻执行,并且只执行一次。这是一个SUN准备的类加载时机

    finalize()方法同样也是SUN为程序员准备的一个时机。这个时机是垃圾回收时机


6、hashCode()方法

  1、在Object类中的源代码:

    public native int hashCode() ;

    这个方法不是抽象方法,带有native关键字,底层调用c++程序。

 

  2.hashCode()返回的是哈希码:

    实际上就是一个java对象的内存地址,经过哈希算法,得出的一个值。

    所以hashCode()方法的执行结果可以等同看作一个java对象的内存地址。


7.clone()方法

  1.克隆,即复制一个对象,该对象的属性与被复制的对象一致,如果不使用Object类中的clone方法实现克隆,可以自己new出一个对象,并对相应的属性进行数据,这样也能实现克隆的目的。

 

  但当对象属性较多时,这样的克隆方式会比较麻烦,所以Object类中实现了clone方法,用于克隆对象。

 

  Java中的克隆分为浅克隆与深克隆

 

  2.实现克隆的方式

    1.对象的类需要实现Cloneable接口

    2.重写Object类中的clone()方法

    3.根据重写的clone()方法得到想要的克隆结果,例如浅克隆与深克隆。

 

  3.浅克隆与深克隆的区别

    浅克隆:复制对象时仅仅复制对象本身,包括基本属性,但该对象的属性引用其他对象时,该引用对象不会被复制,即拷贝出来的对象与被拷贝出来的对象中的属性引用的对象是同一个。(基本变量类型会复制相同值,而引用变量类型也是会复制相同的引用。)

stud e n t"*  Stri name = LiLei• ;  Achievement achieivement;  clone  new studentÜ  String name •LiLei• ;  Achievement achieivement:  float Chinese;  float Math;  float English;

    深克隆:复制对象本身的同时,也复制对象包含的引用指向的对象,即修改被克隆对象的任何属性都不会影响到克隆出来的对象。

 

stu  Strin name • LiLei• ; //É-EÄfÉ  Achievement achieivement;  new studentE*  String name = •LiLei• ;  Achievement achieivement;  float Chinese;  float Math;  float English;  Achievemenü*  float Chinese;  float Math;  float English;

    4.eg.

    浅克隆

     @OverrideprotectedPerson clone()throwsCloneNotSupportedException {
       return(Person)super.clone();//调用父类的clone方法
     }

 

 

推荐阅读