Object类:所有类的超类

Object类是Java中所有类的始祖,在Java中每个类都是由它扩展而来的。但是并不需要这样写:

public class Emloyee extends Object

如果没有明确的指出超类,Object就被认为是这个类的超类。在Java中,只有基本数据类型不是对象,所有数组类型,不管是对象数组还是基本类型的数组都扩展(继承)了Object类。

1.equals方法

Object类中的equals方法用于检车一个对象是否等于另外一个对象。也就是说是否具有相同的引用。当时这种判断相同引用一般来说并没有什么luan用。一般只需要两个对象的状态相等,就认为这两个对象时相等的。

public class Employee{

    private double salary;

    private LocalDate hireDay;

    public boolean equals(Object otherObject){
if(this == otherObject) return true; //是否为相同引用 if(otherObject==null) return false; if(this.getClass() != otherObject.getClass()) return false; //是否属于同一个类 Employee other = (Employee)otherObject;//实例化同一个类则强转 return salary==other.salary&&hireDay.equals(other.hireDay);//判断值是否一致。
} }

2.相等测试与继承

Java语言规范要求equals方法具有下面的特性:

1.自反性:对于任何非空引用x,x.equals(x)返回true

2.对称性:对于任何引用x和y,当且仅当y.equals(x)返回true,x.equals(y)也应该返回true.

3.传递性:对于任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,x.equals(z)也应该返回true

4.一致性:如果x和y引用的对象没有发生任何改变,返回调用x.equals(y)应该返回同样的结果。

5.对于任何的非空引用x,x.equals(null)应该返回false。

然而利用只getClass检测,是不符合置换原则的。这是因为没有任何一个子类需要重新定义集合是否相等的语义(重新定义equals方法)。在Object中的equals方法没有被声明为final,这样做,可以让子类选择更加有效的算法对集合进行是否相等的检测(重写equals方法)。

如果子类能够拥有自己的相等概念(equals方法在子类中定义),则对称性需求将强制采用getClass进行检测。

如果由超类决定相等的概念(equals方法在父类中定义),那么久可以使用instanceof进行检测。这样就可以在不同子类的对象之间进行相等的比较。(比较的域只能是父类的数据域)

一个比较完善的equals方法:

1.方法参数命名为otherObject 类型为Object,稍后用到。

2.判断是否为同一引用,如果相同返回true。

3.判断是否为Null,如果为Null则返回false;

4.判断是否为同一个类或同一个父类,判断是否为同一个类时则需要在每个子类中定义equals方法(使用getClass方法判断)。

如果判断是否为同一个父类,那么相等时只能使用到父类的equals方法(使用instanceof方法)。

5.强制类型转换otherObject引用为需要判断的类型。

6.判断基本数据类型域和对象域是否都一致。一致返回true.

3.hashCode方法

散列码(hash code)是由对象导出的一个整型值。散列码是没有规律的。如果x和y是两个不同的对象,x.hashCode()和y.hashCode()基本上不会相同。例:

        String s = "OK";
StringBuilder sb = new StringBuilder(s);
System.out.println(s.hashCode() + " " + sb.hashCode()); String t = new String("OK");
StringBuilder tb = new StringBuilder(t);
System.out.println(t.hashCode() + " " + tb.hashCode());
2524  1376400422
2524 418304857

此处s和t拥有相同的散列码,这是因为字符串的散列码是由内容导出的。即内容相同,hashCode值相同。

而StringBuffer类中没有定义hashCode方法,是因为它的散列码是由Object类的默认hashCode方法导出的对象存储地址。所以即对象不同,则hashCode值不同。

注意:如果重新定义Equals方法后,hashCode也必须重新定义。保证x.equals(y)返回true,x.hashCode就必须和y.hashCode()的值一致。

4.toString方法

在Objcet中有一个重要的方法,就是toString方法,它用于返回表示对象值得字符串。而Objcet中的toString方法打印的是类名和散列码值。一般比较少用。

   public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

而自定义的实体类,一般都会重写toString方法。而重写的toString方法用方括号把域值括起来。例:

    public String toString() {
return getClass().getName()+"{" +
"salary=" + salary +
", hireDay=" + hireDay +
'}';
}

如果是子类的程序员定义自己的toString方法,并将子域添加进去。那么子类增加super.toString即可。

若类域包含数组类型的。那么使用toString方法将会把数组打印成类名@散列码。是因为数组继承了Object的toString方法。

解决方法:一维数组使用Arrays.toString(数组引用),多维数组使用Arrays.deepToString(数组引用)。

个人提倡使用lombok插件。不需要写set、get、toString方法。更详细的lombok插件解释请自行上网搜索。

若小弟写的有什么不足之处,请在评论区评论或至邮箱821312534@qq.com。Thanks♪(・ω・)ノ

Java核心技术第五章——2.Object类的更多相关文章

  1. Java核心技术第五章——1.类、超类、子类(2)

    继上一篇Java核心技术第五章——1.类.超类.子类(1) 6.重载解析 假如调用ClassName.Method(args) 1.编译器列出类ClassName所有名为Method的方法. 2.编译 ...

  2. [Java核心技术]第四章-对象与类(4.1-4.6总结)

    4.1面向对象程序设计概述 OOP(面向对象编程Object Oriented Programming) OOP中数据第一位,算法第二位. 类 封装:关键在于不能让其他方法直接访问类的实例域,程序仅通 ...

  3. Java核心技术第五章——1.类、超类、子类(1)

    1.定义子类: 关键字extends表明正在构造的新类派生与一个已存在的类.已存在的类称为超类.基类或父类:新类称为子类.派生类或孩子类.超类和子类是Java程序员最常用的两个术语(emmm~~我觉得 ...

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

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

  5. “全栈2019”Java多线程第五章:线程睡眠sleep()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  6. “全栈2019”Java异常第五章:一定会被执行的finally代码块

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  7. “全栈2019”Java第九十五章:方法中可以定义静态局部内部类吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. “全栈2019”Java第十五章:Unicode与转义字符

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. “全栈2019”Java第二十五章:流程控制语句中循环语句while

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. RestTemplate 微信接口 text/plain HttpMessageConverter

    一.背景介绍 使用 Spring Boot 写项目,需要用到微信接口获取用户信息. 在 Jessey 和 Spring RestTemplate 两个 Rest 客户端中,想到尽量不引入更多的东西,然 ...

  2. Python爬取谷歌街景图片

    最近有个需求是要爬取街景图片,国内厂商百度高德和腾讯地图都没有开放接口,查询资料得知谷歌地图开放街景api 谷歌捷径申请key地址:https://developers.google.com/maps ...

  3. Python 文件读写的三种模式和区别

    #coding=utf-8 #__author:Administrator #__time:2018/5/9 13:14 #__file_name:text1 import io #能调用方法的一定是 ...

  4. NOI前的考试日志

    4.14 网络流专项测试 先看T1,不会,看T2,仙人掌???wtf??弃疗.看T3,貌似最可做了,然后开始刚,刚了30min无果,打了50分暴力,然后接着去看T1,把序列差分了一下,推了会式子,发现 ...

  5. Windows上安装配置SSH教程(9)——综合应用:在Windows上使用脚本实现SSH远程登陆与文件传输

    服务器端操作系统:Windows XP 客户端操作系统:Windows10 安装与配置顺序 1.服务端安装OpenSSH 2.服务端配置OpenSSH 3.客户端安装Cygwin 4.客户端安装Tcl ...

  6. 教你如何使用Java手写一个基于链表的队列

    在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...

  7. canvas实现俄罗斯方块

    好久没使用canvas了,于是通过写小游戏"俄罗斯方块"再次熟悉下canvas,如果有一定的canvas基础,要实现还是不难的.实际完成的Demo请看:canvas俄罗斯方块 . ...

  8. Android 7.0 存储系统—Vold与MountService分析(一)(转 Android 9.0 分析)

    Android的存储系统(一) 看了很长时间Vold存储模块的相关知识,也死扣了一段时间的Android源码,发现Android存储系统所涉及的函数调用,以及Kernel与上层之间的Socket传输真 ...

  9. python接口自动化(十六)--参数关联接口后传(详解)

    简介 大家对前边的自动化新建任务之后,接着对这个新建任务操作了解之后,希望带小伙伴进一步巩固胜利的果实,夯实基础.因此再在沙场实例演练一下博客园的相关接口.我们用自动化发随笔之后,要想接着对这篇随笔操 ...

  10. typeconfig.json配置说明

    如果一个目录下存在一个tsconfig.json文件,那么它意味着这个目录是TypeScript项目的根目录. 不带任何输入文件的情况下调用tsc,编译器会从当前目录开始去查找tsconfig.jso ...