常用方法Object(类)

r囧r小猫 2021-12-24 08:41 455阅读 0赞

常用方法Object(类)

  1. public int hashCode()
  2. public final Class getClass()
  3. public String toString()
  4. public boolean equals(Object obj)

一、概述

Java API

Java提供给我们使用的类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用

Object类

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

Object类构造方法

public Object(),子类的构造方法默认访问父类的无参构造

二、Object类的hashCode()方法

  1. public int hashCode()

返回该对象的哈希码值,默认情况下,该方法会根据对象的地址来计算
不同对象的,hashCode()一般来说不会相同。但同一个对象的hashCode()值肯定相同
哈希码值不是对象的实际地址,相当于一个逻辑地址值
案例

  1. public static void main(String[] args) {
  2. int i = new Object().hashCode();
  3. int i1 = new Object().hashCode();
  4. System.out.println(i);
  5. System.out.println(i1);
  6. }
  7. //输出:
  8. 356573597
  9. 1735600054

三、Object类的getClass()方法

  1. public final Class getClass()
  2. 返回该类的字节码文件对象

案例

  1. public static void main(String[] args) {
  2. Object o = new Object();
  3. Object o1 = new Object();
  4. Class<?> aClass = o.getClass(); //字节码文件对象
  5. Class<?> aClass1 = o1.getClass();
  6. String name = aClass.getName();
  7. String name1 = aClass1.getName();
  8. System.out.println(name);
  9. System.out.println(name1);
  10. }
  11. //输出:
  12. java.lang.Object
  13. java.lang.Object

四、Object类的toString()方法

public String toString()

返回该对象的地址值的字符串表现形式,一般重写,输出一个对象则默认在对象名后有隐式的.toString()

源码

  1. public String toString() {
  2. return getClass().getName() + "@" + Integer.toHexString(hashCode());
  3. }
  4. 案例1
  5. public static void main(String[] args) {
  6. Object obj = new Object();
  7. String s = obj.toString(); //获取该对象的地址值的字符串表现形式
  8. System.out.println(s);
  9. Object o = new Object();
  10. System.out.println(o.toString());
  11. }
  12. //输出:
  13. java.lang.Object@1540e19d
  14. java.lang.Object@677327b6
  15. 案例2
  16. public class MyTest {
  17. public static void main(String[] args) {
  18. Teacher teacher = new Teacher("张三", 23);
  19. System.out.println(teacher);
  20. ```
  21. }
  22. ​```
  23. }
  24. class Teacher{
  25. private String name;
  26. private int age;
  27. ```
  28. public Teacher(String name, int age) {
  29. this.name = name;
  30. this.age = age;
  31. }
  32. ​```
  33. //重写toSring方法
  34. @Override
  35. public String toString() {
  36. return "Teacher{" +
  37. "name='" + name + '\'' +
  38. ", age=" + age +
  39. '}';
  40. }
  41. }
  42. //输出:Teacher{name=‘张三’, age=23}

五、Object类的equals()方法

  1. public boolean equals(Object obj)

指示其他某个对象是否与此对象“相等”,默认情况下比较的是对象的引用是否相同,由于比较对象的引用没有意义,一般建议重写该方法。一般用于比较成员变量的值是否相等

源码

  1. public boolean equals(Object obj) {
  2. return (this == obj);

案例

  1. public class MyTest {
  2. public static void main(String[] args) {
  3. Object obj = new Object();
  4. Object obj2 = new Object();
  5. // boolean equals (Object obj) 判断两个对象的地址值是否相同
  6. System.out.println(obj == obj2); //false
  7. boolean b = obj.equals(obj2);
  8. System.out.println(b); //b=true
  9. Student s1 = new Student("张三", 23);
  10. Student s2 = new Student("张三", 23);
  11. System.out.println(s1 == s2);//false
  12. //System.out.println(s1.equals(s2)); //true
  13. //s1.equals(s2) 比较两个对象的地址值,是否相同,对我来说意义不大,我认为的是,只要两个对象的成员变量的值一样,我就认为这两个对象一样。那么我就得重写父类的equals()方法,让他去比较两个对象的成员变量的值是否相同
  14. boolean b1 = s1.equals(new Teacher());//ClassCastException 类型转换异常
  15. System.out.println(b1);//false
  16. boolean b2 = s1.equals(s1);
  17. System.out.println(b2);//true
  18. }
  19. }
  20. class Student {
  21. private String name;
  22. private int age;
  23. public Student(String name, int age) {
  24. this.name = name;
  25. this.age = age;
  26. }
  27. @Override
  28. public boolean equals(Object obj) {
  29. //如果是自己跟自己比,直接就是true
  30. if (this == obj) {
  31. return true;
  32. }
  33. // 让他去比较两个对象的成员变量的值是否相同
  34. if (!(obj instanceof Student)) {
  35. return false;
  36. }
  37. //向下转型
  38. Student stu = (Student) obj;
  39. return this.name.equals(stu.name) && this.age == stu.age;
  40. }
  41. }

equals()方法重写优化

  1. public boolean equals(Object o) {
  2. if (this == o) {
  3. return true;
  4. }
  5. if (o == null || getClass() != o.getClass()) {
  6. return false;
  7. }
  8. Student student = (Student) o;
  9. return age == student.age && Objects.equals(name, student.name);
  10. }

六、Object类的clone() 方法(浅克隆)

protected Object clone () 创建并返回此对象的一个副本

  1. 案例
  2. public class MyTest {
  3. public static void main(String[] args) throws CloneNotSupportedException {
  4. // protected Object clone () 创建并返回此对象的一个副本。
  5. Dog dog = new Dog();
  6. System.out.println(dog);
  7. dog.name="小黑";
  8. dog.age=10;
  9. System.out.println(dog.name);//小黑
  10. System.out.println(dog.age);//10
  11. Dog dog1= (Dog) dog.clone();//需强制转型
  12. System.out.println(dog1);
  13. System.out.println(dog1.name);//小黑
  14. System.out.println(dog1.age); //10
  15. //CloneNotSupportedException 克隆不支持异常
  16. Dog dog2 = new Dog();
  17. Dog dog3 = (Dog) dog2.clone();
  18. System.out.println(dog3.name);//小白
  19. System.out.println(dog3.age);//23
  20. }
  21. }
  22. //此类实现了 Cloneable 接口,以指示 Object.clone()方法可以合法地对该类实例进行按字段复制。
  23. //如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致抛出CloneNotSupportedException 异常。
  24. //Cloneable 没有任何抽象方法的接口,是一个标记接口
  25. class Dog extends Object implements Cloneable{
  26. String name="小白";
  27. int age=23;
  28. @Override
  29. protected Object clone() throws CloneNotSupportedException {
  30. //调用父类的clone功能
  31. return super.clone();
  32. }

对象浅克隆要注意的细节:

  1. 如果一个对象需要调用clone的方法克隆,那么该对象所属的类必须要实现Cloneable接口。
  2. Cloneable接口只不过是一个标识接口而已,没有任何方法。
  3. 对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把
    另外一个对象也克隆一份。
  4. 对象的浅克隆也不会调用到构造方法的。

发表评论

表情:
评论列表 (有 0 条评论,455人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Object方法汇总

    Java语言不同于C++语言,是一种单根继承结构语言,也就是说,Java中所有的类都有一个共同的祖先。这个祖先就是Object类。 object类的结构 ![Objec

    相关 Object方法

    1.clone方法 保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。 2.g