【JAVA基础】10 Object类

1. Object类概述

  • 是类层次结构的根类
  • 每个类都使用 Object 作为超类
  • 所有类都直接或者间接的继承自该类
  • 所有对象(包括数组)都实现这个类的方法。

 

2. Object的构造方法

  • public Object()
  • 回想面向对象中为什么说:
  • 子类的构造方法默认访问的是父类的无参构造方法

 

3. Object类的hashCode()方法

  • Object类的hashCode()方法
    • 案例演示

      • package com.heima.object;
        
        import com.heima.animal.Cat;
        
        
        public class Demo1_HashCode {
        
            /**
             * @param args
             */
            public static void main(String[] args) {
                Object obj1 = new Object();
                int num = obj1.hashCode();
                System.out.println(num); //输出7309408
                
                Cat c1 = new Cat();
                System.out.println(c1.hashCode()); //输出26905665
                
                Cat c2 = new Cat();
                System.out.println(c2.hashCode()); //输出23994111
                
                
            }
        
        }
        hashCode()方法
      • public int hashCode()

        • 返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。

        • 不同对象的,hashCode()一般来说不会相同。但是,同一个对象的hashCode()值肯定相同。

 

4. Object类的getClass()方法

  • Object类的getClass()方法
    • 案例演示

      • package com.heima.object;
        
        import com.heima.animal.Cat;
        
        public class Demo2_GetClass {
        
            /**
             * @param args
             */
            public static void main(String[] args) {
                Cat c1 = new Cat();
                System.out.println(c1.getClass());
                
                Class clazz = c1.getClass(); // 获取该对象的字节码文件
                String name = clazz.getName(); // 获取名称
                System.out.println(clazz);
                System.out.println(name);
                
                System.out.println(c1.hashCode());
                System.out.println(clazz.hashCode());
            }
        
        }
        View Code
      • public final Class getClass()

        • 返回此对象的运行时类。

        • 可以通过Class类中的一个方法,获取对象的真实类的全名称。

        • public String getName()

 

5. Object类的toString()方法

  • 案例演示

    • package com.heima.object;
      
      public class Demo3_ToString {
      
          /**
           * @param args
           */
          public static void main(String[] args) {
              Student s = new Student("Ann", 18);
              String str = s.toString();
              System.out.println(str);
              
              /*public String toString() {
                  return getClass().getName() + "@" + Integer.toHexString(hashCode());
              }
              
              * toString方法源码显示,返回的结果是
              * 类名 + @ + hashCode的十六进制变现形式
              *
              * 这么写,没有实际意义。
              * toString的作用:可以更方便的显示属性值。通过重写toString方法。
              */
              
              System.out.println(s); // 如果直接打印对象的引用,会默认调用toString()方法。
          }
      
      }
    • package com.heima.object;
      
      public class Student {
          private String name;
          private int age;
          
          public Student() {
              super();
              
          }
      
          public Student(String name, int age) {
              super();
              this.name = name;
              this.age = age;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public int getAge() {
              return age;
          }
      
          public void setAge(int age) {
              this.age = age;
          }
      
          @Override
          public String toString() {
              return "Student [name=" + name + ", age=" + age + "]";
          }
          
          
          
          
          
      
      }
      Student类

 

6. Object类的equals()方法

  • 案例演示

    • 指示其他某个对象是否与此对象“相等”。

    • 默认情况下比较的是对象的引用是否相同。

    • 由于比较对象的引用没有意义,一般建议重写该方法。

    • package com.heima.object;
      
      public class Student {
          private String name;
          private int age;
          
          public Student() {
              super();
              
          }
      
          public Student(String name, int age) {
              super();
              this.name = name;
              this.age = age;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public int getAge() {
              return age;
          }
      
          public void setAge(int age) {
              this.age = age;
          }
      
          @Override
          public String toString() {
              return "Student [name=" + name + ", age=" + age + "]";
          }
      
          @Override
          public int hashCode() {
              final int prime = 31;
              int result = 1;
              result = prime * result + age;
              result = prime * result + ((name == null) ? 0 : name.hashCode());
              return result;
          }
      
          @Override
          /*public boolean equals(Object obj) {
              if (this == obj)
                  return true;
              if (obj == null)
                  return false;
              if (getClass() != obj.getClass())
                  return false;
              Student other = (Student) obj;
              if (age != other.age)
                  return false;
              if (name == null) {
                  if (other.name != null)
                      return false;
              } else if (!name.equals(other.name))
                  return false;
              return true;
          }*/
          
          public boolean equals(Object obj){   
              Student s = (Student)obj;
              return this.name.equals(s.name) && this.age == s.age;    
          }
           /*重写equals方法,由于传递的参数为Object obj,而多态中无法直接调用子类中的属性,需要
            * 向下转型,故 Student s = (Student)obj;
            * 从而获取到Student类中的属性:name和age。
            * String类型的数据有equals方法,int数据作为基本数据类型,没有方法,直接使用"=="。
            * */
          
          
          
      
      }
      View Code
  • ==号和equals方法的区别
    • ==是一个比较运算符号,既可以比较基本数据类型,也可以比较引用数据类型,基本数据类型比较的是值,引用数据类型比较的是地址值

    • equals方法是一个方法,只能比较引用数据类型,所有的对象都会继承Object类中的方法,如果没有重写Object类中的equals方法,equals方法和==号比较引用数据类型无区别,重写后的equals方法比较的是对象中的属性

原文地址:https://www.cnblogs.com/zoe233/p/12780196.html