Java_Object
说一下java中的Object类。
1、Object:
Object是java类库中的一个特殊类,也是所有类的父类。
Object类定义了一些有用的方法,由于是根类,这些方法在其他类中都存在,一般是进行了重载或重写,实现了各自的具体功能。
1.1、Object中的equals()方法:
讲到equals()方法 我们先看下 "==" 与 equals()的区别:
==是一个比较运算符,对于基本数据类型来说,比较的是值;引用数据类型比较的是地址值(指是否为同一个对象的引用)(除非是同一个new出来的对象,==比较结果为true,否则均为false)。
equals()是一个方法,只能比较引用数据类型。重写前比较的是地址值,重写后一般是比较对象的属性。
1.2、为什么要重写equals()方法?
Object类中的equals()方法比较的是两个对象的内存地址,对象之间比较内存地址一般是没有意义的,所以我们一般会重写equals()方法。
举个栗子:
我们定义了一个学生类,学生的属性为id和name,我们认为id和name都相同的情况下,他们的equals是true。但是当我们执行代码 控制台输出的却是false。不符合我们的需求,我们需要重写equals()方法。
public class Student {
public Integer id;
public String name;
public Student(Integer id,String name){
this.id = id;
this.name = name;
}
public static void main(String[] args) {
Student s1 = new Student(1,"Rain");
Student s2 = new Student(1,"Rain");
System.out.println(s1.equals(s2));
}
}
1.3、如何重写equals()方法?
原则:
1)自反性:对于任何非空引用X,X.equals(X)应该为true;
2)对称性:对于任何引用X和Y,如果X.equals(Y)返回true,那么Y.equals(X)也应该返回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。
一个栗子:
public class Coder {
public String name;
public int age;
public Coder(){}
public Coder(String name,int age){
this.name = name;
this.age = age;
}
public static void main(String[] args) {
Coder c1 = new Coder("R",26);
Coder c2 = new Coder("R",26);
System.out.println(c1.equals(c2));
}
public boolean equals(Object obj){
//判断是否为同一对象
if(this == obj){
return true;
}
//判断是否为null
if(null == obj){
return false;
}
//判断两者类型
if(this.getClass() != obj.getClass()){
return false;
}
//类型转换
Coder coder = (Coder) obj;
//判断数据
if(this.name.equals(coder.name) && this.age == coder.age){
return true;
}
return false;
}
}
因为重写了equals()方法,控制台输出:true
2.1、Object中的hashCode()方法:
在java中,如果我们重写了equals()方法,那么必定要重写hashCode()方法。why?
首先我们需要知道hashCode的作用。java中hashCode的主要作用是 用增加哈希存储结构(HashMap,HashTable之类)的查找速度,这些哈希存储结构可以通过hashCode来确定对象在哈希存储结构中的存储位置。通过这句描述我们知道:
1)hashCode主要作用在于增加数据在哈希家族中的查找速度;
2)如果hashCode相等,它们在哈希结构中存储位置相等,但是不是同一个对象。换句话说,hashCode相等,调用equals不一定相等;
3)如果equals相等,那么它们的存储位置当然相等,所以hashCode一定是相等的;
那么为什么必须要重写hashCode()方法呢?简单来说,就是为了保证同一个对象,在equals相同的情况下hashCode值必定相同,如果重写了equals()方法而未重写hashCode()方法,可能就会出现两个没有关系的对象equals相同(因为equals都是根据对象的特征进行重写的),但hashCode不同。
一个栗子:
//重写hashCode()
public int hashCode(){
final int prime = 31; //为什么是31?因为这个数需要是质数 31是经 验证的一个能够很好的减少哈希碰撞的质数
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null)?0:name.hashCode());
return result;
}
3.1、Object中的getClass()方法:
getClass()方法返回对象所属的类,是一个class对象。通过Class对象可以获取该类的各种信息,包括类名、父类以及它所实现的接口名称。
一个栗子:
public class Test02 {
public static void printClassInfo(Object obj){
System.out.println("类名:"+obj.getClass().getName());
System.out.println("父类:"+obj.getClass().getSuperclass().getName());
for(int i=0;i<obj.getClass().getInterfaces().length;i++){
System.out.println("实现的接口:"+obj.getClass().getInterfaces()[i]);
}
}
public static void main(String[] args) {
String strobj = new String();
printClassInfo(strobj);
}
}
控制台输出:
类名:java.lang.String
父类:java.lang.Object
实现的接口:interface java.io.Serializable
实现的接口:interface java.lang.Comparable
实现的接口:interface java.lang.CharSequence
OK,Object类的方法就介绍以上三个。
Java_Object的更多相关文章
- java_object的具体使用--上帝
就我们所知道的,java中有子类和父类,子类由于继承父类而形成,那么父类还有没有父类呢?答案是有了,父类的父类就是object类,一切父类都继承了它,那么根据继承的属性,每一个子类都有一个object ...
- java_Object类、日期时间类、System类、包装类
Object类 java.lang.Object 类是所有类的父类.它描述的所有方法子类都可以使用.在对象实例化的时候,最终找的父类就是Object. 如果一个类没有特别指定父类, 那么默认则继承自O ...
- 可输出sql的PrepareStatement封装
import java.io.InputStream; import java.io.Reader; import java.net.URL; import java.sql.Connection; ...
- Android学习笔记之DocumentBuilder的使用....
PS:当你的才华还撑不起你的野心时,那你需要静下心来学习..... 学习内容: 1.从服务器上获取XML文档... 2.解析XML文档中的内容... XML文件想必大家都非常的熟悉,可扩展的标记语 ...
- 通过数据库表自动生成POJO(JavaBean)对象
主类: package bqw.tool; import java.util.ResourceBundle;import java.sql.DriverManager;import java.sql. ...
- JDBC学习总结(一)
1.JDBC概述 JDBC是一种可以执行SQL语句并可返回结果的Java API,其全称是Java DataBase Connectivity,也是一套面向对象的应用程序接口API,它由一组用 ...
- JAVA数据类型与DB2、Oracle、Sybase以及SQL Server对应关系
java.sql.Types Java IBM DB2 Oracle Sybase SQL-SERVER BIGINT java.lang.long BIGINT NUMBER (38, ...
- 1.org.hibernate.MappingException: No Dialect mapping for JDBC type: -9
org.hibernate.MappingException: No Dialect mapping for JDBC type: -9 原因:Hibernate框架的方言(Dialect )没有数据 ...
- jdbcType与javaType的对应关系
java.sql.Types 值 Java 类型 IBM DB2 Oracle Sybase SQL Informix IBM Content Manager BIGINT java.lang.lon ...
随机推荐
- 安装版本( 相关关系 Vue SSR 指定版本)
1. 关于 brew mac包管理器 终端安装 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebr ...
- JAVA之简单编程练习
1.有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 解决思路:递归方法解决,兔子的规律为数列1,1,2,3,5,8 ...
- C# 用Serializer.ToXml()方法转换成两种格式的XML
常见XML格式两种: 这种是属性的格式,实体的Model属性上面加上这个特性 [XmlAttribute] <AAA aa="/> 这种是标签的格式,实体的Model属性上面加上 ...
- Mac环境下Redis的安装
1.下载 官网下载地址:https://redis.io/download,选择对应的下载版本,我下载的是4.0.12 2.安装 1)下载文件解压后复制到/usr/local/目录下(快速找到路径小技 ...
- A previous installation of Qt5 Visual Studio Add-in was detected. Please uninstall it before running this installer解决办法
前段时间在安装Qt Visual Studio插件的时候,安装到一半不小心中止了,结果后来怎么安装都不行,提示已经安装了,要先卸载, 可是到哪里都找不到有卸载的,因为压根就没有安装完成.这可害苦我了. ...
- vue 双向数据绑定的实现学习(二)- 监听器的实现
废话:上一篇https://www.cnblogs.com/adouwt/p/9928278.html 提到了vue实现的基本实现原理:Object.defineProperty() -数据劫持 和 ...
- Java_异常以及处理
目录 JAVA异常 异常的处理机制 自定义异常 写了一天的bug,来try...catch...finally了解一下.异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. ...
- OpenCV-Python:车道检测
任务: 一共要完成两项任务: 1. 在所提供的公路图片上检测出车道线并标记 2. 在所提供的公路视频上检测出车道线并标记 方案: 要检测出当前车道,就是要检测出左右两条车道直线.由于无人车一直保持在当 ...
- python 集合去重
data = set() data.clear() data.add('qq1') data.add('qq2') data.add('qq3') data.add('qq4') data.add(' ...
- PHP如何处理emoji表情存入utf8的数据库
一般Mysql表设计时,都是用UTF8字符集的.把带有emoji的昵称字段往里面insert一下就没了,整个字段变成了空字符串.这是怎么回事呢? 原来是因为Mysql的utf8字符集是3字节的,而em ...