• 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类的方法就介绍以上三个。

  • 相关阅读:
    pip备忘录
    Vue.js---------------1引入
    centos安装数据库
    Python之网络编程二
    Python之协议
    Python高级
    jvm-3学习教程
    jvm学习-2
    jvm相关学习
    八种常用的排序算法
  • 原文地址:https://www.cnblogs.com/Rain1203/p/10757969.html
Copyright © 2020-2023  润新知