Object:是所有类的根类。所有的类都直接或者间接的继承自该类
1
创建学生对象打印学生对象的地址值(本质上是将地址通过哈希算法算出的哈希值)
同一个对象的哈希值肯定是一样的。
哈希值相同的对象的地址值未必一样。
新华字典,zhu -- 456(哈希值) -- 猪(第三个),朱(第5个),珠(第9个)
2
为什么重写toString()方法
默认情况下,打印的是对象的字符串表示,意义不大。
包名...类名+@+该对象的哈希值的十六进制
所以,我们建议,所有子类重写该方法。
自动生成即可。
表示该对象的数据:
[类名 成员变量1=数据值1,成员变量2=数据值2,...]
1 class Student{ 2 //姓名和年龄 3 private String name; 4 private int age; 5 //自动生成的快捷键shift+alt+s 6 public String getName() { 7 return name; 8 } 9 public void setName(String name) { 10 this.name = name; 11 } 12 public int getAge() { 13 return age; 14 } 15 public void setAge(int age) { 16 this.age = age; 17 } 18 public Student(String name, int age) { 19 super(); 20 this.name = name; 21 this.age = age; 22 } 23 public Student() { 24 super(); 25 } 26 //重写Object类中的toString方法,自动生成即可 27 28 public String toString() { 29 return "Student [name=" + name + ", age=" + age + "]"; 30 } 31 32 } 33 34 35 public class StudentDemo { 36 public static void main(String[] args) { 37 //创建学生对象,并打印学生对象 38 Student s1 = new Student("林志玲", 50); 39 Student s2 = new Student("刘德华", 55); 40 41 //打印两个学生对象 42 System.out.println(s1);//com.edu.object.Student@3cf5b814 43 System.out.println(s2);//com.edu.object.Student@28084850 44 /** 45 * com.edu.object.Student@28084850,我们之前称他为地址值其实是不够准确的, 46 * 因为当时为了让大家好理解,我们就暂且称他为地址值。 47 * 注意:他其实说白了是一个对象的字符串表示形式--格式:包名+类名+@+该对象的哈希码值 48 * 49 * 什么是哈希吗值呢? 50 * 有一种哈希算法,可以将对象的哈希吗值算出来,同一个对象的哈希吗值是一样的, 51 * 但是记住,哈希吗值一样不代表就是同一个对象 52 * 53 * 举例:新华字典 54 * zhu 465页(哈希吗值) 猪 (第1个) 住(第四个) 祝(第六个) 55 */ 56 }
运行结果如下:
Student [name=林志玲, age=50]
Student [name=刘德华, age=55]
3
equals():
默认情况下,比较的是地址值。没有意义。
所以,建议子类重写该方法。
自动生成即可。
这个生成的方法作用是比较对象的成员变量值是否相同。
1 class Student2{ 2 private String name; 3 private int age; 4 public Student2(String name, int age) { 5 super(); 6 this.name = name; 7 this.age = age; 8 } 9 public Student2() { 10 super(); 11 // TODO Auto-generated constructor stub 12 } 13 public String getName() { 14 return name; 15 } 16 public void setName(String name) { 17 this.name = name; 18 } 19 public int getAge() { 20 return age; 21 } 22 public void setAge(int age) { 23 this.age = age; 24 } 25 26 public int hashCode() { 27 final int prime = 31; 28 int result = 1; 29 result = prime * result + age; 30 result = prime * result + ((name == null) ? 0 : name.hashCode()); 31 return result; 32 } 33 34 //equals()方法在这里比较的是对象的成员变量值,当一个对象和另一个对象的成员变量值完全相同的时候,equals() 35 //就可以认为这两个对象时同一个对象 36 37 public boolean equals(Object obj) { 38 if (this == obj) 39 return true; 40 if (obj == null) 41 return false; 42 if (getClass() != obj.getClass()) 43 return false; 44 Student2 other = (Student2) obj; 45 if (age != other.age) 46 return false; 47 if (name == null) { 48 if (other.name != null) 49 return false; 50 } else if (!name.equals(other.name)) 51 return false; 52 return true; 53 } 54 } 55 56 57 public class ObjectDemo { 58 public static void main(String[] args) { 59 //创建两个学生对象 60 Student2 s1 = new Student2(); 61 Student2 s2 = new Student2(); 62 //equals()方法是Object类中的方法,默认比较的是对象的地址值 63 System.out.println(s1.equals(s2)); 64 System.out.println(s1==s2);// ==完全就可以比较地址值 65 66 //创建两个学生对象 67 Student2 s3 = new Student2("刘德华", 55); 68 Student2 s4 = new Student2("刘德华", 55); 69 System.out.println(s3.equals(s4)); 70 71 }
运行结果如下:
true
false
true