A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李洪因 中级黑马   /  2013-3-15 14:25  /  1846 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李洪因 于 2013-3-15 21:40 编辑
  1. public class Student {
  2.         

  3.         public static void main(String[] args)
  4.         {
  5.         Scanner sc = new Scanner(System.in);            
  6.         System.out.println("请输入用户名:");
  7.         String username = sc.nextLine();
  8.         System.out.println("请输入密码:");
  9.         String password = sc.nextLine();
  10.             if (username.equals("admin") && password.equals("admin")) {
  11.                         System.out.println("true");}
  12.             else
  13.             {
  14.                     System.out.println("false");
  15.             }

  16.         
  17. }
  18.             


  19. }
复制代码
为什么上面的equals方法没有复写但是正确呢?


而下面的代码切要复写了equals方法了呢?
  1. public class Student {

  2.     private String name;

  3.       private int age;

  4.       public Student(String name,int age)

  5.       {

  6.       this.name=name;

  7.       this.age=age;

  8.       }

  9.       public static void main(String[] args)

  10.       {

  11.       Student st1 = new Student("zhang",20);

  12.       Student st2 = new Student("zhang",20);

  13.       if(st1.equals(st2))

  14.                       System.out.print("相等");

  15.       else

  16.                     System.out.print("不相等");



  17.     }

  18.      public boolean equals(Object obj){

  19.               

  20.               

  21.               

  22.               if(obj==null) return false;

  23.               else

  24.               {

  25.                if(obj instanceof Student){

  26.                 Student c=(Student)obj;//强制转换

  27.                if(c.name==this.name && c.age==this.age ){

  28.                 return true;

  29.                }

  30.                }

  31.               }

  32.               return false;

  33.               

  34.              }

  35.             





  36. }
复制代码
我想知道这个equals方法什么时候复写呢?请教各位大侠。。。

点评

如果你的问题已经得到解决,请将分类改为已解决,如果还有问题请继续追问!谢谢  发表于 2013-3-15 15:58

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

6 个回复

倒序浏览
String的equals是被jdk底层重写过的  所以我们在编程的时候不需要覆写
其他情况 如果是自己定义的类 则都要覆写equals
如果是jdk提供的类
点进去看看它有没有覆写equals  如果它没有覆写 而你又要使用 则需自己覆写

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
String类在底层已经复写了Object这个上帝类的equals方法,String类的equals方法判断的依据是被判断的两个字符串常量字符序列是否相同,若是就返回true;
而其它的大部分类或者程序员自定义的类,都直接调用的是Object类的equals方法,这时的equals方法判断的依据仅仅是两个对象的引用是否都指向同一个对象。

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 csatshell 于 2013-3-15 14:54 编辑

对于你的疑问,需要先从Object这个类说起。Obeject类是所有没有显式继承其他类的父类。也就是说类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。这个根类中有equals方法。
一、任何继承Obeject类的子类,要么直接使用Object类中的方法,直接使用的话,就是直接使用Object类中的equas的功能,这个功能就是指示其他某个对象是否与此对象“相等”,她比较的是地址值。要么覆写其中的方法,重写equals方法,定义自己的比较方式。
二、 String 类代表字符串。字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。(这句话来自String类的API文档)。对于String类中的equals方法,你可以这样理解,她 比较的是字符串内容,只要字符串的内容相同就返回true;例如:String s1="abc";String s2="abc"   String s3="abcd",s1.equals(s2)结果是true  ,而s1.equals(s3)是false;
三,对于你第一个示例没有重写equals方法得到了的结果,你可以用上述第二点解释。 对于下面的示例,你是覆写了Object类中的equals方法,通过比较姓名和年龄两个是否相同返回结果建立自己Student类的自己的比较方法

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
csatshell讲的很清晰,学习了。
回复 使用道具 举报
Object类中的euqals方法代码:
public boolean equals(Object obj){
this==obj
}
equals 也是用==比较的,  可以比较对象的地址,一般重写equals方法是为了比较对象的成员属性是否相同。
就如你的代码中(c.name==this.name && c.age==this.age )重写equals是为了比较学生的名字和年龄属性是否相等,用来判断学生的信息。
回复 使用道具 举报
答的很详细,感谢楼上几位!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马