说一下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的更多相关文章

  1. java_object的具体使用--上帝

    就我们所知道的,java中有子类和父类,子类由于继承父类而形成,那么父类还有没有父类呢?答案是有了,父类的父类就是object类,一切父类都继承了它,那么根据继承的属性,每一个子类都有一个object ...

  2. java_Object类、日期时间类、System类、包装类

    Object类 java.lang.Object 类是所有类的父类.它描述的所有方法子类都可以使用.在对象实例化的时候,最终找的父类就是Object. 如果一个类没有特别指定父类, 那么默认则继承自O ...

  3. 可输出sql的PrepareStatement封装

    import java.io.InputStream; import java.io.Reader; import java.net.URL; import java.sql.Connection; ...

  4. Android学习笔记之DocumentBuilder的使用....

    PS:当你的才华还撑不起你的野心时,那你需要静下心来学习..... 学习内容: 1.从服务器上获取XML文档... 2.解析XML文档中的内容...   XML文件想必大家都非常的熟悉,可扩展的标记语 ...

  5. 通过数据库表自动生成POJO(JavaBean)对象

    主类: package bqw.tool; import java.util.ResourceBundle;import java.sql.DriverManager;import java.sql. ...

  6. JDBC学习总结(一)

    1.JDBC概述     JDBC是一种可以执行SQL语句并可返回结果的Java API,其全称是Java DataBase Connectivity,也是一套面向对象的应用程序接口API,它由一组用 ...

  7. JAVA数据类型与DB2、Oracle、Sybase以及SQL Server对应关系

     java.sql.Types Java  IBM DB2  Oracle  Sybase  SQL-SERVER BIGINT java.lang.long  BIGINT  NUMBER (38, ...

  8. 1.org.hibernate.MappingException: No Dialect mapping for JDBC type: -9

    org.hibernate.MappingException: No Dialect mapping for JDBC type: -9 原因:Hibernate框架的方言(Dialect )没有数据 ...

  9. jdbcType与javaType的对应关系

    java.sql.Types 值 Java 类型 IBM DB2 Oracle Sybase SQL Informix IBM Content Manager BIGINT java.lang.lon ...

随机推荐

  1. java学习笔记10-方法

    我们经常用到System.out.println(),它到底是什么? System是系统类 out是系统类的标准输出对象 println()是一个方法 也就是说是调用了System类中的标准输出对象o ...

  2. 开头不讲"Hello Word",读尽诗书也枉然 : Word 操作组件介绍 - Spire.Doc (转)

      [原文地址]http://www.cnblogs.com/liqingwen/p/5898368.html 序 本打算过几天简单介绍下组件 Spire.XLS,突然发现园友率先发布了一篇,既然 x ...

  3. zabbix3.2自动发现批量监控redis端口状态

    使用nmap提示被防火墙阻挡,实际没有启用防火墙 [root@eus_chinasoft_haproxy:/usr/local/aegis]# nmap 172.20.103.202 -p 7000 ...

  4. lua post参数获取,参数截断

    post 请求头: a.application/x-www-form-urlencoded 普通表单提交 b.multipart/form-data 含有文件的表单,二进制上传 c.applicati ...

  5. C#获取用户登录IP地址

    public static string GetUserIp() {        string ip;        string[] temp;        bool isErr = false ...

  6. Keil相关问题

    1.keil重选则器件 2. 移植FREERTOS出错 .\Objects\RTOSDemo.axf: Error: L6406E: No space in execution regions wit ...

  7. laravel 运行错误

    全局相关 1 2 3 4 5 6 7 8 9 10 11 12 13 14 php artisan:显示详细的命令行帮助信息,同 php artisan list php artisan –help: ...

  8. [转]Example Design - Using the AXI DMA in polled mode to transfer data to memory

    Description Attached to this Answer Record is an Example Design for using the AXI DMA in polled mode ...

  9. JAVA-MyBaits对应XML的两种使用方式

    概述 在使用XML写SQL语句的时候,遇到参数传递的两种方式,也就是Mapper里面带@Param注解和不带的情况,容易混淆,对应XML的写法也不相同,使用的时候要注意对照代码比对(备注XML里面的关 ...

  10. UOJ#394. 【NOI2018】冒泡排序

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ394.html 题解 首先我们发现一个数不能既被往左换又被往右换.也就是说不能有任何一个数左边有比他大的, ...