欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

11.JAVA-Object类之finalize(),clone(),toString()等方法覆写

程序员文章站 2022-05-29 12:05:06
1.Object介绍 Object类是一个特殊的类,是所有类(包括数组,接口 )的父类,如果一个类没有用extends明确指出继承于某个类,那么它默认继承Object类,所以可以通过向上转型的方法使用类型为Object的变量指向任意类型的对象。 本章主要实现覆写Object类的clone(),toS ......

1.object介绍

object类是一个特殊的类,是所有类(包括数组,接口 )的父类,如果一个类没有用extends明确指出继承于某个类,那么它默认继承object类,所以可以通过向上转型的方法使用类型为object的变量指向任意类型的对象。

  • 本章主要实现覆写object类的clone(),tostring()equals(),finalize()等最重要的方法。

 

2.覆写finalize()

 11.JAVA-Object类之finalize(),clone(),toString()等方法覆写

在之前我们学习析构方法时,便讲过finalize().

参考之前学的finallize方法示例:3.java-方法重载,类的封装,构造/析构方法

从本章学习开始,才发现原来是通过覆写object类的finalize()实现的垃圾回收.

 

3.覆写clone()

 11.JAVA-Object类之finalize(),clone(),toString()等方法覆写

如上图所示,该方法是protected类型,不能在类外直接调用.该方法主要的功能是实现两个对象深拷贝(两个对象地址都是独立的),我们平时写的代码"对象1 = 对象2"其实是浅拷贝(两个对象地址是一致的,修改对象1便等于修改对象2).

3.1 注意事项

覆写clone之前,我们需要实现cloneable接口(该接口在java中自带的,不需要自己写),如果不实现的话,则调用clone时,将会报异常.并且覆写clone时,可以将clone改为public类型,介绍如下所示:

 11.JAVA-Object类之finalize(),clone(),toString()等方法覆写

 

3.2 覆写clone代码如下

class person implements cloneable   //实现cloneble
{
         public string name;

         public person(string name)
         {
                  this.name = name ;
         }

         public object clone(){             //覆写clone
                  person o = null;
                  try{
                          o = (person)super.clone();
                  }catch(clonenotsupportedexception e){
                          e.printstacktrace();
                  }
                  return o;
         }
}

public class test{
         public static void main(string args[])
         {
                  person p1=new person("小王");
                  person p2 = p1;
                  p2.name = "小张";
                  system.out.println("p1 name:"+p1.name);
                  system.out.println("p2 name:"+p2.name);

                  system.out.println("通过object超类下的clone方法实现深拷贝:");
                  p2  = (person)p1.clone();
                  p2.name = "小王";
                  system.out.println("p1 name:"+p1.name);
                  system.out.println("p2 name:"+p2.name);
         }
}

运行打印:

 11.JAVA-Object类之finalize(),clone(),toString()等方法覆写

如上图所示,可以看到直接对对象进行赋值,其实是浅拷贝,而通过clone()则实现的深拷贝

 

4.覆写tostring()

 11.JAVA-Object类之finalize(),clone(),toString()等方法覆写

覆写tostring()的意义在于:

  • 方便打印一个对象的具体信息,并且由于是覆写的object类,所以通过向上转换后,则可以确定参数的统一.方便程序设计.

4.1 覆写tostring代码如下

class teacher
{   
      string name;
      int  age;
      teacher(string name,int  age)
      {
            this.name = name;
            this.age  = age;
      }
      public string tostring()
      {
            return "老师名字:"+name+" 年龄:"+age;
      }
}

class student
{   
      string name;
      string clas;
      student(string name,string clas)
      {
            this.name = name;
            this.clas = clas;
      }
      public string tostring()
      {
            return "学生名字:"+name+"   班级:"+clas;
      }
}

public class test
{
      public static void printdesc(object obj)       //打印描述
      {
            system.out.println(obj.tostring());
      }

      public static void main(string args[]){
            printdesc(new teacher("李芳芳",24));    //向上转型
            printdesc(new student("小明","初1-6班"));//向上转型  
      }
}

运行打印:

 11.JAVA-Object类之finalize(),clone(),toString()等方法覆写

从上面代码可以看到, 我们直接通过object参数,便兼容了不同类的一致性

 

5.覆写equals()

 11.JAVA-Object类之finalize(),clone(),toString()等方法覆写

覆写equals()的意义和tostring()类似,主要是方便程序设计,并且通过equals()可以判断对象是否相同.

覆写equals()时,则需要判断的有:

  • 两个对象地址是否相同
  • 对象是否为null
  • 两个对象是否为相同类
  • 两个对象的内容是否一致...

 

由于代码很简单,就不写了.

 

6.覆写hashcode()

 11.JAVA-Object类之finalize(),clone(),toString()等方法覆写

6.1 object类中的hashcode()和string类中的hashcode()

hashcode()用来获取一个对象的哈希值,一般用来比较用的,而 object类中的hashcode是返回对象在内存中地址转换成的一个int值(实际就是地址值)。所以如果没有重写hashcode方法,任何对象的hashcode都是不相等的。

而对于string类中的hashcode方法,则根据对象自身的字符串内容来生成一个哈希值

6.2 参考示例如下所示:

class student                    //未覆写hashcode()的类
{       
         string name;
         string clas;
         student(string name,string clas)
         {
                  this.name = name;
                  this.clas = clas;
         }
}

public class test
{
         public static void main(string args[]){
                  student st1 = new student("小明","初1-6班");
                  student st2 = new student("小明","初1-6班");
                  system.out.println("st1:"+st1.hashcode());
                  system.out.println("st2:"+st2.hashcode()); 

                  string str1 = new string("小明  初1-6班");
                  string str2 = new string("小明  初1-6班");
                  system.out.println("str1:"+str1.hashcode());
                  system.out.println("str2:"+str1.hashcode());       
         }
}

运行打印:

 11.JAVA-Object类之finalize(),clone(),toString()等方法覆写

如上图可以看到,对于相同内容st1和st2而言,它们的hash值完全不同,如果我们将它们使用到hashtable之类的哈希表上的话,将会出现 st1和st2内容相同,却存储在表里的位置却不同,

并且比较st1和st2相等时,也会出现false.

因为判断哈希表里两个对象相等时,也会先判断hash值是否相等再判断是否equals().

目的:hash值能够加快判断速度,但是hash值也有可能值相同从而出现冲突,所以如果两个对象相等时,会再次判断一次equals().

6.3 接下来重写修改上面类覆写hashcode()

class student                   
{       
         string name;
         string clas;
         student(string name,string clas)
         {
                  this.name = name;
                  this.clas = clas;
         }
         public int hashcode()              //覆写hashcode()
         {
                  return name.hashcode()*2+clas.hashcode();
         }
}

运行打印:

 11.JAVA-Object类之finalize(),clone(),toString()等方法覆写

 

未完待续.