Java基础系列23-常用api之Object类

x33g5p2x  于2021-12-18 转载在 其他  
字(3.7k)|赞(0)|评价(0)|浏览(488)

一.Object类概述

Object是类层次结构的根类,所有的类都直接的或者间接的继承自该类。

Object 类api文档

二.Object类案例

2.1 Object类的toString()方法

Object:是类层次结构的根类,所有的类都直接的或者间接的继承自该类。
构造方法:Object()

直接输出对象名,输出底层调用的是该对象的toString()
查看API,我们发现建议所有子类都重写toString()。
到底该如何重写该方法呢?自动生成的就可以。

代码:
object1

  1. package Java_study;
  2. /**
  3. *
  4. * @author 只是甲
  5. * @date 2021-06-30
  6. * @remark Object类的toString()方法
  7. *
  8. */
  9. public class object1 {
  10. private String name;
  11. private int age;
  12. public object1() {
  13. }
  14. public object1(String name, int age) {
  15. this.name = name;
  16. this.age = age;
  17. }
  18. public String getName() {
  19. return name;
  20. }
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24. public int getAge() {
  25. return age;
  26. }
  27. public void setAge(int age) {
  28. this.age = age;
  29. }
  30. @Override
  31. //第一次打印object1对象时还没有重写toString方法,打印出来的是一串地址值
  32. //由于所有类的都默认继承Object类,所以也可以使用父类的toString(),默认打印了包名+类名+@+内存地址
  33. //重写tostring()可以自定义实现打印输出的结果
  34. public String toString() {
  35. return "object1[" +
  36. "name='" + name + '\'' +
  37. ",age=" + age +
  38. ']';
  39. }
  40. }

objectTest1

  1. package Java_study;
  2. /**
  3. *
  4. * @author 只是甲
  5. * @date 2021-06-30
  6. * @remark Object类的toString()方法-测试类
  7. *
  8. */
  9. public class objectTest1 {
  10. public static void main(String[] args) {
  11. object1 student = new object1();
  12. student.setName("杜兰特");
  13. student.setAge(32);
  14. //1。重写toString方法前: Java_study.object1@15db9742
  15. //2. 重写toString方法后:objectTest1[name='杜兰特', age=32]
  16. System.out.println(student);
  17. /*//按住ctrl点击println查看打印方法的源码
  18. public void println(Object x) { //相当于子类对象赋值给父类的引用--多态的方式向上转型,即=> Object x = student;
  19. String s = String.valueOf(x);
  20. synchronized (this) {
  21. println(s);
  22. }
  23. }*/
  24. /* //再次按住ctrl点击valueOf方法查看源码,因为student对象不为null,所以实际上又调用了toString方法
  25. public static String valueOf(Object obj) {
  26. return (obj == null) ? "null" : obj.toString();
  27. }
  28. */
  29. //输出结果与直接打印对象名一致
  30. //直接输出对象名,输出底层调用的是该对象的tostring()
  31. System.out.println(student.toString());
  32. /* //再次按住ctrl点击toString方法查看源码 返回的是类名+包名+@+内存的哈希地址
  33. public String toString() {
  34. return getClass().getName() + "@" + Integer.toHexString(hashCode());
  35. }
  36. */
  37. }
  38. }

2.2 Object类的equals()方法

==:
  可以比较基本数据类型,比较基本数据类型的时候比较的是基本数据类型的值是否相同
  也可以比较引用数据类型,比较引用数据类型的时候比较的是引用数据类型的地址值是否相同

而我们现在想比较的是对象的内容是否相同?该怎么办呢?
通过查看API,我们找到了比较对象是否相等的方法:
  public boolean equals(Object obj)
  Object类中的equals()方法默认比较的是对象的地址是否相同。
如果我们想比较对象的内容是否相同,就必须自己重写该方法。

代码:
object2

  1. package Java_study;
  2. /**
  3. *
  4. * @author 只是甲
  5. * @date 2021-06-30
  6. * @remark 学生类 Object类的equals()方法
  7. *
  8. */
  9. public class object2 {
  10. private String name;
  11. private int age;
  12. public object2() {
  13. }
  14. public object2(String name,int age) {
  15. this.name = name;
  16. this.age = age;
  17. }
  18. public String getName() {
  19. return name;
  20. }
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24. public int getAge() {
  25. return age;
  26. }
  27. public void setAge(int age) {
  28. this.age = age;
  29. }
  30. @Override
  31. public boolean equals(Object obj) {
  32. //执行语句: s1.equals(s2)
  33. //this: 表示 s1
  34. //obj: 表示 s2
  35. //没有加括号的if语句只能控制一个分号内的方法体,s1==s2不成立,所以此条return true不执行
  36. if (this == obj) return true;
  37. // obj == null -- 比较的对象是否为空(不成立)
  38. // getClass() != obj.getClass() -- 比较的对象是否不是同一个类的对象,如果不是同一个类的则没有比较的意义(不成立)
  39. // a||b表示:当a、b有一个为真时,结果为真。a、b都为假时结果为假。
  40. // false || false => false 所以此条return false不执行
  41. if (obj == null || getClass() != obj.getClass()) return false;
  42. //obj向下转型(强转)
  43. object2 that = (object2) obj;
  44. // a&&b表示:当a、b都为真时,结果为真。有一个为假或者都为假时结果为假。
  45. // age == that.age 表示 s1.age == s2.age 判断结果为true
  46. // name.equals(that.name) 表示 s1.name == equals(s2.name) 比较字符内容是否相同,判断结果为true
  47. // true && true => true ;所以此条 return true 给测试类Demo3ObjectMethodEquals
  48. return age == that.age && name.equals(that.name);
  49. }
  50. }

objectTest2

  1. package Java_study;
  2. /**
  3. *
  4. * @author 只是甲
  5. * @date 2021-06-30
  6. * @remark 学生测试类 Object类的equals()方法
  7. *
  8. */
  9. public class objectTest2 {
  10. public static void main(String[] args) {
  11. object2 s1 = new object2("杜兰特",32);
  12. object2 s2 = new object2("杜兰特",32);
  13. //object2对象 重写equals方法前:【false】
  14. //object2对象 重写equals方法前:【true】
  15. System.out.println(s1.equals(s2)); //true
  16. //s1,s2代表实例的引用 位于栈中,真正的对象实例存储在堆中,s1,s2存储了其实例在堆中的内存地址
  17. //重写equals方法前,比较的是s1,s2的地址值,因为是两个不同对象,所以地址值不同,结果为【false】
  18. //重写equals方法后,我们指定比较两者的属性值,结果为【true】
  19. Integer a = 123;
  20. Integer b = 123;
  21. System.out.println(a == b);//true
  22. }
  23. }

参考:

  1. https://blog.csdn.net/qq_43529621/article/details/115379095

相关文章