在《学习Java,容易被你忽略的小细节(2)》中我们已经深入讨论过String类中equals()方法的使用,在本文中我们将进一步讨论equals()方法在其他境况下的使用方法。

  首先,我们先提供一个网址http://docs.oracle.com/javase/7/docs/api/,长期从事Java程序设计的程序员都知道这个网址。没错这里展示的就是Oracle公司提供的Java API的技术文档,以后大家如果在Java程序设计时遇到什么问题基本都可以在这里找到答案。

  大家都知道Java中根类是Object,在Java中每一个类都来源与java.lang.Object类。所以熟悉Object类提供的方法是非常重要的,这样才能在自己定义的类中使用它们。本文中我们仅讨论Object中equals()方法。

  Object类中默认实现equals()方法的语句如下:

public boolean equals(Object o)
{
return (this == o)
}

  显然,在Object类中使用equals()方法等价于使用==运算符,难道Java语言设计者闲的没事做定义了一个没用的方法吗?很明显这是不可能的,于是我们想测试一下在自定义类中equals()方法是否也等价于==运算符呢?

  测试代码:

public class Student{
String name;
int age;
String sex;
Student(String n,int a,String s){
name = n;
age = a;
sex = s;
}
public static void main(String[] args){
Student s1 = new Student("zhang",20,"male");
Student s2 = new Student("zhang",20,"male");
if(s1.equals(s2))
System.out.println("s1.equals(s2) 结果为true");
else
System.out.println("s1.equals(s2) 结果为false");
}
}

  显然s1和s2内容相同,但是并非同一对象。下面我们看一下运行结果:

  从运行结果上我们可以看出的确在自定义类中equals()方法也等价于==运算符,这是怎么一回事呢?

  但是我们来仔细回想一下String类中equals()方法调用的结果,很明显与我们上面做的测试不符。很多聪明的读者大概猜到是String类对equals()方法进行了覆盖。其实,在很多情况下程序员都会在自定义的类中覆盖equals()方法,使其变成用来判断对象内容是否相等的方法。这也是学习Java程序设计应该熟练掌握的技巧之一。

  下面提供Student类中equals()方法的具体实现。

    public boolean equals(Object o)
{
if(o instanceof Student)  //判断o是否是Student类
{
Student s = (Student)o;  //强制类型转换
return this.name.equals(s.name) &&
this.age == s.age &&
this.sex.equals(s.sex);
}
else
{
return false;
}
}

  测试结果:

  经过上面覆盖我们自定义的类中的equals()方法就可以实现类似String类中equals()方法的功能,用来判断对象内容是否相同了。

  下面再介绍一个有关equals()方法使用常见的集中错误:  

//No1
String s1;
String s2 = new String();
s1.equals(s2); //这时s1为null,程序编译时抛出异常NullPointerException

  

  上面就是学习Java,容易被你忽略的小细节(3)。

  欢迎继续关注本博更多新鲜动向,博主QQ:2584451009,有什么建议和忠告欢迎评论或留言。

学习Java,容易被你忽略的小细节(3)的更多相关文章

  1. 学习Java,容易被你忽略的小细节(2)

    昨天心情真的太糟糕了,写完<学习Java,值得注意你注意的问题(1)>之后,迎来些许的支持以后就是一片片的谴责.我的主页上涌现出许许多多Java方面的牛人,谴责我水平太低,写的问题太初级. ...

  2. 学习Java,值得你留意的问题(1)更名为《学习Java,容易被你忽略的小细节(1)》

    记得大二快要结束的时候,有个女孩子突然问我“你会Java吗,帮我做大作业好吗?” 实话说,那个女孩真的很漂亮,我当时也非常想帮她.但是我从来没有接触过Java,让我在短短的几天内完成Java程序设计课 ...

  3. java 性能优化:35 个小细节,让你提升 java 代码的运行效率

    前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没 ...

  4. JAVA性能优化:35个小细节让你提升java代码的运行效率

    代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是, ...

  5. java中的@Override标签,小细节大作用

    转载:http://www.cnblogs.com/octobershiner/archive/2012/03/09/2388370.html 一般用途                         ...

  6. Java生鲜电商平台-关于学习生鲜电商平台的思考(小程序/APP)

    Java生鲜电商平台-关于学习生鲜电商平台的思考(小程序/APP) 说明:最近群里面的一个网友问的一个问题,让我陷入了深思,他问的问题很基础也很真实,"大佬,你们是怎么学习的呢?" ...

  7. 系统学习 Java IO (一)----输入流和输出流 InputStream/OutputStream

    目录:系统学习 Java IO ---- 目录,概览 InputStream 是Java IO API中所有输入流的父类. 表示有序的字节流,换句话说,可以将 InputStream 中的数据作为有序 ...

  8. 从零开始学习JAVA(入门基础)

    目录 博主从零开始学习JAVA(入门基础) 1.搭建JAVA开发环境 卸载JDK(未安装的请忽略) 安装JDK 2.编程语言中,何为编译型与解释型 编译型 解释型 3.第一个JAVA应用程序 4.JA ...

  9. 论新手该如何学习java?

    由于我国高等教育制度教材陈旧,加上java自身发展不过十年左右的时间,还有一个很重要的原因就是java这门语言更适合商业应用,所以高校里大部分博士老师们对此语言的了解甚至不比本科生多. 在这种环境下, ...

随机推荐

  1. nodebb中文社区

    V2MM —— 自由职业者社区 https://v2mm.tech/ 萌梦社区 https://qtdream.com/ React Native 中文社区 http://bbs.reactnativ ...

  2. class helper 可能是从 Delphi 2007 增加的新语法

    class helper 可能是从 Delphi 2007 增加的新语法, 因为感觉不太实用, 直到今天才测试了一下. 试过之后才知道: 挺有意思的! 基本功能就是修改已存在的类. Txxx = cl ...

  3. SQL server添加链接服务器脚本

    ---恢复内容开始--- exec sp_addlinkedserver  'ZZSJK','','SQLOLEDB','192.168.10.22'  --链接服务器名称 ‘’ ip地址exec s ...

  4. 学术论文写作的 paper、code 资源

    (机器学习/计算机视觉/深度学习)代码 0. 核心期刊 Best paper awards at - CV NIPS: JMLR COLT & ICML(每年度的官网) 1. Computin ...

  5. 一些常用的WebServices

    天气预报Web服务,数据来源于中国气象局 Endpoint  Disco  WSDL IP地址来源搜索 WEB 服务(是目前最完整的IP地址数据) Endpoint  Disco  WSDL 随机英文 ...

  6. Python 动图、动画制作 —— moviepy、matplotlib.animation

    进入命令行界面(windows ⇒ cmd),下载安装,pip install moviepy 0. figure 的成员函数 # 创建 figure fig, ax = plt.subplots() ...

  7. 如何停止处于stopping状态的windows服务(使用taskkill)

    工作中有时需要启动和停止windows service,有时候会出现服务处于stopping或者starting的状态,但是,在services界面中,start service/stop servi ...

  8. 图像处理与计算机视觉的 topics

    光学图像(optical image): the apparent reproduction of an object, formed by a lens or mirror system from ...

  9. OpenGL(十九) gluOrtho2D、glViewport、glutInitWindowSize区别与关系

    gluOrtho2D定义剪裁面,通过正交投影,把景物(模型)按照1:1的比例绘制到一个剪裁面上,相当于对世界坐标窗口的一个截取. glViewport定义视口,即视见窗口,是从世界坐标系窗口到屏幕坐标 ...

  10. WPF 3D 平移模型+动画(桥梁检测系统)

    原文:WPF 3D 平移模型+动画(桥梁检测系统) 关于WPF 3D,网上有很多旋转的例子,但是关于平移的例子并不是太多.本文并非WPF 3D扫盲篇,因此需要对WPF 3D有一定了解,至少知道View ...