说一下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()方法。

  1. public class Student {
  2. public Integer id;
  3. public String name;
  4.  
  5. public Student(Integer id,String name){
  6. this.id = id;
  7. this.name = name;
  8. }
  9.  
  10. public static void main(String[] args) {
  11. Student s1 = new Student(1,"Rain");
  12. Student s2 = new Student(1,"Rain");
  13.  
  14. System.out.println(s1.equals(s2));
  15. }
  16. }

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。

一个栗子:

  1. public class Coder {
  2. public String name;
  3. public int age;
  4.  
  5. public Coder(){}
  6. public Coder(String name,int age){
  7. this.name = name;
  8. this.age = age;
  9. }
  10.  
  11. public static void main(String[] args) {
  12. Coder c1 = new Coder("R",26);
  13. Coder c2 = new Coder("R",26);
  14. System.out.println(c1.equals(c2));
  15. }
  16.  
  17. public boolean equals(Object obj){
  18. //判断是否为同一对象
  19. if(this == obj){
  20. return true;
  21. }
  22. //判断是否为null
  23. if(null == obj){
  24. return false;
  25. }
  26. //判断两者类型
  27. if(this.getClass() != obj.getClass()){
  28. return false;
  29. }
  30. //类型转换
  31. Coder coder = (Coder) obj;
  32. //判断数据
  33. if(this.name.equals(coder.name) && this.age == coder.age){
  34. return true;
  35. }
  36. return false;
  37. }
  38. }

因为重写了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不同。

一个栗子:

  1. //重写hashCode()
  2. public int hashCode(){
  3. final int prime = 31; //为什么是31?因为这个数需要是质数 31是经 验证的一个能够很好的减少哈希碰撞的质数
  4. int result = 1;
  5. result = prime * result + age;
  6. result = prime * result + ((name == null)?0:name.hashCode());
  7. return result;
  8. }

3.1、Object中的getClass()方法:

getClass()方法返回对象所属的类,是一个class对象。通过Class对象可以获取该类的各种信息,包括类名、父类以及它所实现的接口名称。

一个栗子:

  1. public class Test02 {
  2. public static void printClassInfo(Object obj){
  3. System.out.println("类名:"+obj.getClass().getName());
  4.  
  5. System.out.println("父类:"+obj.getClass().getSuperclass().getName());
  6.  
  7. for(int i=0;i<obj.getClass().getInterfaces().length;i++){
  8. System.out.println("实现的接口:"+obj.getClass().getInterfaces()[i]);
  9. }
  10. }
  11.  
  12. public static void main(String[] args) {
  13. String strobj = new String();
  14. printClassInfo(strobj);
  15. }
  16. }

控制台输出:

  1. 类名:java.lang.String
  2. 父类:java.lang.Object
  3. 实现的接口:interface java.io.Serializable
  4. 实现的接口:interface java.lang.Comparable
  5. 实现的接口: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. C# - 设计模式目录

    什么是设计模式 设计模式(OOD)是在面向对象编程(Object Oriented Programming,OOP)中针对在以往的编程里出现的问题所提出的一种解决思路.一种设计类型时的思想和经验,对未 ...

  2. [系统集成] 基于telegraf, influxdb, grafana 建立 esxi 监控

    之前在 nagios 上建立了 esxi 监控,指标少.配置麻烦.视觉效果差.最近我把 esxi 监控迁移到了 influxdb+grafana 平台上,无论是监控指标.可操作性还是视觉效果都有了很大 ...

  3. Oracle GoldenGate微服务架构的服务Shell脚本

    Oracle GoldenGate微服务架构的/etc/init.d下的OracleGoldenGate服务Shell脚本: #!/bin/sh # # Oracle GoldenGate Servi ...

  4. eclipse:插件安装总结

    1.SVN插件 首先安装SVNKIT,下载地址:https://svnkit.com/download.php 再安装Subclipse,这个在marketplace安装即可. 2.安装时报错:Una ...

  5. jdk7和8中关于HashMap和concurrentHashMap的扩容过程总结,以及HashMap死循环

    题外话:为什么要hashcode进行spread? 充分使用key.hashCode()的高16位信息,保证hash分布更分散, 扩容操作是新建2倍于原表大小的新表,并将原表结点拷贝一份放在新表中,对 ...

  6. 物化视图(materialized view) 实现数据迁移、数据定时同步

    近日公司有一个9i 的Oracle数据库,运行效率低下.想要将其升级到11G. 但是升级之前 要将数据进行同步,好在表不是很多.只有三张表.业务压力也不大,就想到了使用物 化视图的方式将数据同步过来. ...

  7. Dapper+SqlServerCe部署

    C:\Program Files\Microsoft SQL Server Compact Edition\v4.0 目录下面 选择下面这 7 个 SQL Server Compact DLL,并复制 ...

  8. SpringBoot的自动配置

    1.根据条件来装配bean,SpringBoot的自动配置,根据条件进行自动配置. 首先创建一个接口,如下所示: package com.bie.encoding; /** * * @Descript ...

  9. redis单点、redis主从、redis哨兵sentinel,redis集群cluster配置搭建与使用

    目录 redis单点.redis主从.redis哨兵 sentinel,redis集群cluster配置搭建与使用 1 .redis 安装及配置 1.1 redis 单点 1.1.2 在命令窗口操作r ...

  10. 《连载 | 物联网框架ServerSuperIO教程》- 16.集成OPC Server,及使用步骤。附:3.3 发布与版本更新说明。

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...