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
  • 两个对象是否为相同类
  • 两个对象的内容是否一致...
class Student
{
String name; //名字
String clas; //班级
int score; //成绩 Student(String name,String clas,int score)
{
this.name = name;
this.clas = clas;
this.score = score;
}
/*覆写Object类的equals方法*/
public boolean equals(Object obj)
{
if(obj == null) //地址为null
return false; if(obj instanceof Student == false) //非本类
{
System.out.println("ERR");
return false;
} if(this == obj) //地址相同
return true; Student st = (Student)obj; if(this.name.equals(st.name) &&
this.clas.equals(st.clas) &&
this.score == st.score )
return true; return false;
} }

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

运行打印:

下章学习:12.JAVA-基本数据类型的包装类操作

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

  1. java中的Object类和其clone()

    1.Object是所有类的父类,任何类都默认继承Object,即直接或间接的继承java.lang.Object类.由于所有的类都继承在Object类,因此省略了extends Object关键字. ...

  2. java.lang.Object类与equals()及toString()的使用

    1.Object类是所有Java类的根父类 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 3.Object类中的功能(属性.方法)就具有通用 ...

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

    JAVA之旅(九)--Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类 天天被一些琐事骚扰,学习还得继续 一.Object类 Obj ...

  4. java中Object类的finalize的用法

    Object类的finalize的用法: 马克-to-win:java当中有个垃圾回收机制,具体说,就是当一些对象被创建使用之后若不再使用的话{比如(i)对象被置成null.(ii)局部对象(无需置成 ...

  5. Java基础:Object类中的equals与hashCode方法

    前言 这个系列的文章主要用来记录我在学习和复习Java基础知识的过程中遇到的一些有趣好玩的知识点,希望大家也喜欢. 一切皆对象   对于软件工程来说面向对象编程有一套完整的解决方案:OOA.OOD.O ...

  6. [Java学习] Java Object类

    Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: 1 ...

  7. 160810、Java Object类

    Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: p ...

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

    Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: p ...

  9. Java Object类中toString方法的重写

    Object类中的tostring方法的: 当我们输出一个对象时,实际是输出的是这个类中的tostring方法,是一个地址值,而不是类中的属性. 1 一:子类没有重写Object类中的toStrinn ...

随机推荐

  1. HDU1852 Beijing 2008(快速幂+特殊公式)

    As we all know, the next Olympic Games will be held in Beijing in 2008. So the year 2008 seems a lit ...

  2. kali-linux简单学习(二)

    一.SET 社会工程学工具包有一个叫devolution. 启动 setoolkit 里面可以进行一些钓鱼攻击. tabnabbing  attack这种方式是完整克隆一个网站挂到SET创建的web服 ...

  3. poj3417 Network——LCA+树上差分

    题目:http://poj.org/problem?id=3417 根据一条边被几个环覆盖来判断能不能删.有几种情况等: 用树上差分,终点 s++,LCA s-=2,统计时计算子树s值的和即可: 用S ...

  4. POJ2406(next原理理解)

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 40448   Accepted: 16828 D ...

  5. bzoj1941

    KD-tree **了这道题 这个估价函数好鬼畜,把min打成max... 关于min的估价函数非常鬼畜,具体我也不知道为什么. #include<bits/stdc++.h> using ...

  6. CodeForces 1109E. Sasha and a Very Easy Test

    题目简述:给定$m \leq 10^9+9$,维护以下操作 1. "1 l r x":将序列$a[l], a[l+1], \dots, a[r]$都乘上$x$. 2. " ...

  7. sublime配置java环境

    今天突然不想用eclipse编写java了,觉得sublime挺好用,就想用sublime配置java环境,以下是过程以及出现的问题. 一.配置Java环境 1.打开我的电脑–属性–高级–环境变量 2 ...

  8. 1.25-1.26 Coordinator数据集和oozie bundle

    一.Coordinator数据集 二.oozie bundle

  9. 3.11-3.14 Hive 企业使用优化2

    一.查看HQL执行计划explain 1.explain hive在执行的时候会把所对应的SQL语句都会转换成mapreduce代码执行,但是具体的MR执行信息我们怎样才能看出来呢? 这里就用到了ex ...

  10. 20个Flutter实例视频教程-第10节: 一个不简单的搜索条-1

    20个Flutter实例视频教程-第10节: 一个不简单的搜索条-1 视频地址: https://www.bilibili.com/video/av39709290/?p=10 博客地址: https ...