在《学习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,有什么建议和忠告欢迎评论或留言。