一、Object 概述
java.lang.Object 类是 Java 语言中的根类,即所有类的父类。
在对象实例化的时候,最终找的父类就是 Object。
如果一个类没有特别指定父类,那么默认则继承自 Object 类。
Demo:
public class MyClass /*extends Object*/ {
// ...
}
Object 类当中包含的方法有11个,下面主要来介绍其中的两个:
public String toString()`:返回该对象的字符串表示。
public boolean equals(Object obj):指示其他某个对象是否与此对象“相等”。
二、toString方法
方法:
public String toString()
:返回该对象的字符串表示。
toString 方法返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值。
由于 toString 方法返回的结果是内存地址,而在开发中,需要按照对象的属性得到相应的字符串表现形式,因此也需要进行重写。
覆盖重写:
如果不希望使用 toString 的默认行为,则可以对它进行覆盖重写。
Demo:
public class Person {
private String name;
private int age; @Override
public String toString() {
return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
} // 省略构造器与Getter Setter
}
Tips:在我们直接使用输出语句输出对象名的时候,其实通过该对象调用了其 toString() 方法。
三、equals 方法
方法:
public boolean equals(Object obj)
:指示其他某个对象是否与此对象“相等”。
调用成员方法 equals 并指定参数为另一个对象,则可以判断这两个对象是否是相同的。这里的“相同”有默认和自定义两种方式。
默认比较:
如果没有覆盖重写 equals 方法,那么 Object 类中默认进行 == 运算符的对象地址比较,只要不是同一个对象,结果为 false。
equals 方法源码:
public boolean equals(Object obj) {
return (this == obj);
}
参数:
Object obj :可以传递任何的对象
== 比较运算符,返回的是一个布尔值 true false
基本数据类型:比较的是值
引用数据类型:比较的是两个对象的地址值。
对象内容比较:
如果希望进行对象的内容比较,即所有或指定的部分成员变量相同就判断两个对象相同,则需要覆盖重写 equals 方法。
Demo:下面以 person 为例重写 equals 方法。
import java.util.Objects; public class Person {
private String name;
private int age; @Override
public boolean equals(Object o) {
// 如果对象地址一样,则认为相同
if (this == o)
return true;
// 如果参数为空,或者类型信息不一样,则认为不同,采用了反射技术
if (o == null || getClass() != o.getClass())
return false;
// 转换为当前类型
Person person = (Person) o;
// 要求基本类型相等,并且将引用类型交给java.util.Objects类的equals静态方法取用结果
return age == person.age && Objects.equals(name, person.name);
}
}
Tips:一般集成开发工具都有自动生成 equals 和 toString 的方法。
四、Objects 方法
上面重写 equals 方法中,使用了 java.util.objects 类,下面对这个类进行了解。
在 JDK7 添加了一个 Objects 工具类,它提供了一些方法来操作对象,它由一些静态的使用方法组成,这些方法是 null-save(空指针安全的) 或 null-tolerant(容忍空指针的),用于计算对象的 hashcode、返回对象的字符串表示形式、比较两个对象。
在比较两个对象的时候,Object 的 equals 方法容易抛出空指针异常,而 Object 类中的 equals 方法优化了这个问题。
方法如下:
public static boolean equals(Object a, Object b):判断两个对象是否相等。
源码:
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
有兴趣的可以仔细研读一下源码。
Java 之 Object 类的更多相关文章
-
Java面向对象 Object类 内部类
Java面向对象 Object类 内部类 知识概要: 一:Object类 二:内部类 匿名内部类的写法 1.Object O ...
-
Java之Object类和常用的API
Object类和常用的API 学习过程中的笔记,涉及到Objetc中的equals方法和toString方法,日期类Date,日历类Calendar,日期格式化类SimpleDateFormat以及基 ...
-
Java中Object类hashCode的底层实现
Java中Object类hashCode的底层实现 openjdk\jdk\src\share\native\java\lang\Object.c 42 static JNINativeMethod ...
-
Java之Object类用法总结
Object类概述: 1.Object类是所有Java类的根父类. 2.如果在类的声明中未使用extends关键字指明其父类, 则默认父类为java.lang.Object类. Object类主要结构 ...
-
java之Object类介绍
1.Object类是所有java类的基类 如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类,ex: public class Person{ ~~~~~ } 等价于 p ...
-
【Java基础之Object类(一)】Java中Object类中的所有方法(toString、equals、hashCode、clone、finalize、wait和notify等)详解(转载)
java中的hashcode.equals和toString方法都是基类Object的方法. 首先说说toString方法,简单的总结了下API说明就是:返回该对象的字符串表示,信息应该是简明但易于读 ...
-
JDK1.8源码(一)——java.lang.Object类
本系列博客将对JDK1.8版本的相关类从源码层次进行介绍,JDK8的下载地址. 首先介绍JDK中所有类的基类——java.lang.Object. Object 类属于 java.lang 包,此包下 ...
-
浅析Java的Object类
前言: 最近在回顾Java基础,在此过程中,查看源码是少不了的 这里以JDK8以基准,记录一些自己查看源码的观感 Object类,翻阅源码,看看这个类的所在位置,是在 java.lang 包下 ...
-
java.lang.Object类
Object类是java所有对象的基类,包含着java最核心和最基础的类,在编译时会自动导入.具体的类结构图: 1.构造器 public Object(); 大部分情况下,Java中通过形如 new ...
随机推荐
-
$.ajx的用法
$.ajax({type:'post',//可选geturl:'action.php',//这里是接收数据的PHP程序data:'data='dsa'',//传给PHP的数据,多个参数用&连接 ...
-
开发ASP.NET MVC设置统一的命名空间
当你创建一个全新的ASP.NET MVC专案之后,你想设置统一的命名空间,从可以下面几次入手. 首先设置专案的属性: 第二步,打开Views/Web.config文件,修改: 第三步,修改路由文件的命 ...
-
南邮oj[1401] 乘车费用
Description lqp家离学校十分十分远,同时他又没有钱乘taxi.于是他不得不每天早早起床,匆匆赶到公交车站乘车到学校.众所周知CZ是个公交车十分发达的地方,但是CZ的公交车十分的奇怪,lq ...
-
ThinkPHP访问不存在的模块跳到404页面
在ACTION中新建一个文件EmptyAction.class.php,文件中的代码如下: <?php class EmptyAction extends Action{ functio ...
-
Redis 配置文件 redis.conf 项目详解
Redis.conf 配置文件详解 # [Redis](http://yijiebuyi.com/category/redis.html) 配置文件 # 当配置中需要配置内存大小时,可以使用 1k, ...
-
Qt 智能指针学习(7种QT智能指针和4种std智能指针)
从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ #include <QApplication> #include <QLabel> int main(int arg ...
-
Largest Rectangle in a Histogram [POJ2559] [单调栈]
题意一个围挡由n个宽度为1的长方形挡板下端对齐后得到,每个长方形挡板的高度为hi.我们把其抽象成一个图形,问这个图形中包含的面积最大的长方形是多大? 输入多行数据,每行第一个为n,后面n个数,代表hi ...
-
Hash及HashMap简介
Hash简介: Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射 ...
-
JDK8新特性,给接口添加一个默认实现
在JDK8中,允许给接口本身添加一个默认的实现.用“default”进行修饰.如下实例 package interfacetest; public interface TestInterface { ...
-
#001 GIT创建分支
GitHub创建分支 如何在github 创建 一个分支出来,进行开发,最后在 merge 到主干上. Git 操作命令 git branch branchName //创建一个分支 git chec ...