以下通过实际例子对类创建过程汇中常用的equals()、hashcode()、toString()方法进行展示,三个方法的创建过程具有通用性,在项目中可直接改写。

//通过超类Employee和其子类Manager ,验证在类继承过程中equals()、hashcode()、toString()方法的使用.
package equals;
public class EqualsTest{
    public static void main(String[] args){
        Employee alice1=new Employee("Alice Adams",75000,1987,12,15);
        Employee alice2=alice1;//对象复制
        Employee alice3=new Employee("Alice Adams",75000,1987,12,15);
        Employee bob=new Employee("Bob Brandson",50000,1989,10,1);
        System.out.println("alice1==alice2:"+(alice1==alice2));
        System.out.println("alice1==alice3:"+(alice1==alice3));
        System.out.println("alice1.equals(alice3):"+alice1.equals(alice3));
        System.out.println("alice1.equals(bob):"+alice1.equals(bob));
        System.out.println("bob.toStirng():"+bob);//使用toString()方法和输出bob对象的字符串形式
        
        //创建子类Manager的对象变量
        Manager carl=new Manager("Carl Cracker",80000,1987,12,15);
        Manager boss=new Manager("Carl Cracker",80000,1987,12,15);
        boss.setBluns(5000);
        
        System.out.println("boss.toString():"+boss);
        System.out.println("carl.equals(boss):"+carl.equals(boss));
        System.out.println("alice1.hashCode():"+alice1.hashCode());

//调用hashcode()方法导出对象的散列码
        System.out.println("alice3.hashCode():"+alice3.hashCode());
        System.out.println("boss.hashCode():"+boss.hashCode());
        System.out.println("carl.hashCode():"+carl.hahsCode());
        
        
    }
}

//创建超类Employee
package equals;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Objects;

public class Employee{
    
    private String name;
    private double salary;
    private Date hireDay;//创建类对象变量
    
    //创建超类的构造器
    public Employee(String n,double s,int year,int month,int day){
        name=n;
        salary=s;
        GregorianCalendar calendar=new GregorianCalendar(year,month-1,day);//使用带参数的构造器创建对象变量
        hireDay=calendar.getTime();
    }
    
    //创建域访问器和更改器方法
    public String getName(){
        return name;
    }
    
    public double getSalary(){
        return salary;
    }
    
    public Date getHireDay(){
        return hireDay;
    }
    
    //创建方法raiseSalary()
    public void raiseSalary(double byPercent){
        double raise=salary*byPercent/100;
        salary+=raise;
        
    }
    
    //创建方法equals()
    public boolean equals(Object otherObject){
        if(this==otherObject){//检测this和otherObject是否引用同一对象
            return true;
        }
        
        if(otherObject==null){//检测显式参数是否为null,是则返回false
            return false;
        }
        
        if(getClass()!=otherObject.getClass()){
        //比较this和otherObject是否属于同一个类,如果两者不属于同一个类,则不能进行equals()操作

return false;
        }
        
        //将otherObject转换成相应的类类型变量
        Employee other=(Employee)otherObject;
        
        //现在开始对所需要比较的域进行比较
        return Objects.equals(name,other.name)
                &&Objects.equals(salary,other.salary)//&&salary==other.salary这种写法是否可行?
                &&Objects.equals(hireDay,other.hireDay);
        
                
    }
    
    public int hashCode(){
        //Objects.hash()方法提供多个参数,
        //对各个参数调用Objects.hashCode()方法获得各自的散列值,并组合这些散列值。
        return Objects.hash(name,salary,hireDay);
        
    }
    
    public String toString(){
        return getClass().getName()+"[name"+name+"salary="+salary+"hireDay="+hireDay+"]";
        
    }
    
}

//创建Employee子类Manager
package equals;

public class Manager extends Employee{
    private double bouns;//创建子类自身新的的实例域
    public Manager(String n,double s,int year.int month,int day){
        super(n,s,year,month,day);//调用超类的构造函数
        bouns=0;
    }
    
    public double getSalary(){//覆写超类Employee的getSalary()方法
        double baseSalary=super.getSalary();//调用超类的getSalary()
        return baseSalary+bouns;
    }
    
    public void setBouns(double a){
        bouns=a;
    }
    
    public boolean equals(Object otherObject){//覆写超类Employee的equals()方法
        if(!super.equals(otherObject)){
            return false;
            
        }
        
        Manager other=(Manager)otherObject;
        return  bouns==other.bouns;    
        
    }
    
    public int hashCode(){
        return super.hashCode()+17*new Double(bouns).hashCode();
        
    }
    
    public String toString(){
        return super.toString()+"[bouns="+bouns+"]";
        
    }
}

Java:验证在类继承过程中equals()、 hashcode()、toString()方法的使用的更多相关文章

  1. equals hashcode toString 方法的使用

    package com.wu.toString; import java.util.Date; import java.util.GregorianCalendar; /** * * @author ...

  2. Java 中equals和toString()方法重写

    1,equals方法 (1)什么时候需要重写? 如果希望不同内存但相同内容的两个对象equals时返回true,则需要重写equals (2)怎么重写? class A { public int i; ...

  3. CAS SSO:汇集配置过程中的错误解决方法

    本教程为gevin.me原创文章,转载请注明: CAS SSO:配置过程中的错误解决方法 | Gevin’s Blog 本文将收集在配置CAS SSO遇到的所有错误,希望对大家有帮助,也方便下次搭建的 ...

  4. 问题:C# ToString("P");结果:c#中的常用ToString()方法总结

    c#中的常用ToString()方法总结   很多类都重写了ToString方法, 导致很多类的tostring到底执行了什么,有哪些参数,都不清楚 对于int,double等的tostring: C ...

  5. c#中的常用ToString()方法总结

    c#中的常用ToString()方法总结 对于int,double等的tostring: C 货币 2.5.ToString("C") ¥2.50 D 十进制数 25.ToStri ...

  6. JavaScript中Object.prototype.toString方法的原理

    在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. ? 1 2 var arr = []; console.lo ...

  7. Java类继承关系中的初始化顺序

    Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类Ini ...

  8. 《JS权威指南学习总结--9.3 JS中JAVA式的类继承》

    内容要点: 一.JS中的类 1.JAVA或其他类似强类型 面向对象语言的 类成员的模样 实例字段:它们是基于实例的属性或变量,用以保存独立对象的状态. 实例方法: 它们是类的所有实例所共享的方法,由每 ...

  9. java中“”==“” equals hashcode的关系

    ava中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比 ...

随机推荐

  1. 关于Java中Eclipse运行卡顿、未响应,Cpu100%的快速处理办法

    1.与近几日我以及我的同事们遇到一件非常奇怪的问题,我们目前在实现一个小程序,但是不知为何,Eclipse突然变得很卡,以为是小问题最后闹到重启都没解决,于是 我开始查找造成这个现象的原因,发现这个程 ...

  2. sublime text 的小细节设置,让你的代码更优美

    这些属性都可以在 首选项>设置-默认 里修改下面也会介绍几个比较常用的几个插件 字体大小: "font_size": 17 高亮编辑中的一行 "highlight_ ...

  3. 也来谈谈IT培训

    园子里这篇博客火了:谈谈培训机构的"骗局"给新人一些建议,刚好我也一直被问到这个话题,今天就凑个热闹,一吐为快吧. 我从包工头转行做开发,是进了培训班的,但两年的课程,我只学了半年 ...

  4. APUE 3 -- 信号(signal)<I> :概念

    信号可以理解成一种软件中断.他提供了一种异步处理事件的方式.每个信号都有一个与之对应的信号名,这些信号名都带有SIG前缀,如:SIGABRT,SIGALARM.头文件signal.h 中定义了所有的信 ...

  5. 挖个坑,写一个Spring+SpringMVC+Mybatis的项目

    想挖个坑督促自己练技术,有时候想到一个项目,大概想了一些要实现的功能,怎么实现.现在觉得自己差不多能完成QQ空间的主要功能了.准备立个牌坊,写一个类似功能的网站.并且把进度放到这里来. 初步计划实现以 ...

  6. mysql转ElasticSearch的案例分析

    前言 最近工作中在进行一些技术优化,为了减少对数据库的压力,对于只读操作,在程序与db之间加了一层-ElasticSearch.具体实现是db与es通过bin-log进行同步,保证数据一致性,代码调用 ...

  7. spring mvc:ueditor跨域多图片上传失败解决方案

    公司在开发一个后台系统时需要使用百度的UEditor富文本编辑器,应用的场景如下: UEditor的所有图片.js等静态资源在一个专有的静态服务器上: 图片上传在另外一台服务器上: 因为公司内部会使用 ...

  8. LVS-NAT搭建HTTP及HTTPS

    author:JevonWei 版权声明:原创作品 搭建NAT模式的HTTP环境 网络拓扑图如下 网络环境 RS1 192.168.198.138 RS2 192.168.198.120 LVS: D ...

  9. ios和android的发展前景比较

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt164 一直都有很多人在讨论未来的IOS和android市场哪个前景更好,现在 ...

  10. Liunx-常用命令的总结(5)

    cd     ../dir        上一节目录下dir目录 cd -                    返回上次目录 ifconfig            查看IP地址 sudo   if ...