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

1.Object介绍

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

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

2.覆写finalize()

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

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

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

3.覆写clone()

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

3.1 注意事项

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

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);
         }
}

运行打印:

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

4.覆写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班"));//向上转型
      }
}

运行打印:

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

5.覆写equals()

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

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

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

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

6.覆写hashCode()

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());
         }
}

运行打印:

如上图可以看到,对于相同内容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();
         }
}

运行打印:

未完待续.

原文地址:https://www.cnblogs.com/lifexy/p/10845739.html

时间: 2024-10-09 14:51:49

11.JAVA-Object类之finalize(),clone(),toString()等方法覆写的相关文章

Java Object类中的-----------clone()克隆机制

package java_lang_object; public class User implements Cloneable { public Address address; public int age; public String name; public User(int age,String name){ this.age = age; this.name = name; this.address = new Address("广州天河"); } public  User

JAVA之旅(九)——Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类

JAVA之旅(九)--Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类 天天被一些琐事骚扰,学习还得继续 一.Object类 Object是什么呢?我们可以翻阅JAVA API文档看他的介绍 上面介绍说,object是类层次结构的根类,也就是超类 Object:是所有对象的直接后者间继承关系,传说中的老祖宗,你父亲还有父亲,你父亲的父亲还有父亲是爷爷,这是继承关系,但是你的祖宗却只有一位,该类中定义的肯定是所有对象都具备的功能

Java Object类学习笔记

看下Api文档的一些说明 public class Object Class Object is the root of the class hierarchy. Every class has Object as a superclass. All objects, including arrays, implement the methods of this class. Since: JDK1.0 从JDK1.0就已经存在的元老类,类结构的根,所有类的父类,所有类都实现了这个类的方法,包含

java Object 类

Object java.lang.Object 所有Java类的父类 类继承关系的根 1) Object o; 引用o中可以储存任何对象 2) Object类中的方法是所有Java对象都具有的方法 getClass() : 返回对象的实际类型 判断a和b两个引用是否存储同类对象 a.getClass()==b.getClass() finalize(): 当垃圾收集器回收垃圾对象时,自动调用 垃圾对象:零引用 垃圾收集时机:内存耗尽 toString(): 返回对象的字符串形式 public S

四. Java继承和多态10. Java Object类

Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: public class Demo{ // ... } 实际上是下面代码的简写形式: public class Demo extends Object{ // ... } 在Java中,只有基本类型不是对象,例如数值.字符和布尔型的值都不是对象,所有的数组类型,不管是对象数组还是基本类型数组都是继承自

浅谈Java Object类

Java Object类 Object类是一个通用类,Java所有的类都是从Object类继承出来的.所以可将创建对象的过程理解为 public class Cars extends Object{ // 继承Object } Object类不是一个抽象类,部分方法是可以被覆盖的. Object类中有许多有用的方法 equals() 比较两个类是否相等 getClass() 告诉你对象是从哪里被初始化的 hashCode() 列出此对象的哈希代码 toString() 列出类的名称和一个我们不关

java Object类源代码详解 及native (转自 http://blog.csdn.net/sjw890821sjw/article/details/8058843)

Java代码  package java.lang; public class Object { /* 一个本地方法,具体是用C(C++)在DLL中实现的,然后通过JNI调用.*/ private static native void registerNatives(); /* 对象初始化时自动调用此方法*/ static { registerNatives(); } /* 返回此 Object 的运行时类.*/ public final native Class<?> getClass();

java Object类学习

/* * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * * * * * * * * * * * * * * * * * * * */ package java.lang; /** * Class {@code Object} is the root

java object类

java.lang.Object java.lang包在使用的时候无需显示导入,编译时由编译器自动导入. Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类. Object类是Java中唯一没有父类的类. 其他所有的类,包括标准容器类,比如数组,都继承了Object类中的方法. Object类中的方法 构造方法:public Object() 文档中的类概览: Java中的每个类都具有定义在Object类中的这些方法. protected Object clone() Cr