面向对象 - Object类常用方法

返回目录

Object类

    • Object类:Object类是所有Java类的根基类,也就意味着所有的Java对象都拥有Object类的属性和方法,如果在类的声明中未使用extends关键字指明其父类,则默认继承Object类。
    • toString方法:Object类中定义有public String toString()方法,其返回值是 String 类型。Object类中toString方法的源码为:
      /* 默认会返回“<包>.<类名><@><16进制的hashcode>”
      在打印输出或者用字符串连接对象时,会自动调用该对象的toString()方法。*/
      public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
      }
       
      // 重写toString方法
      public class Test {
        int a = 123;
        public static void main(String[] args) {
          Test t = new Test();
          //打印对象,本质是调用toString方法,由于自动继承不需要写成 t.toString()
          System.out.println(t); 
        }
        
        public String toString() {
          return "重写Object类toString方法"+a;
        }
      }
      
    • ==和equals方法:“==”表示比较双方是否相同,如果是基本类型则表示值相等,如果是引用类型则表示地址相等即是同一个对象;“equals”在Object类中定义为public boolean equals(Object obj)方法,表示“对象内容相等”的逻辑,例如通过身份证判断是不是同一个人,再例如人脸识别把人脸生成一段数字用来判断是不是一个人,equals会比较两个对象的hashcode,是同一个对象的引用时返回true,否则返回false。
      // Object类中的equals方法
      public boolean equals(Object obj) {
        return (this == obj);
      }
       
      public class Test {
        public static void main(String[] args) {
          User u1 = new User(100,"黄泽雨","123456");
          User u2 = new User(100,"黄泽风","123456");
          
          System.out.println(u1 == u2); //为false,因为对象不同
          //重写equals后,只根据id判断,为ture
          System.out.println(u1.equals(u2)); //如果不重写,在Object默认还是使用==,由于对象不同则为false
        }
      }
      
      class User {
        int id;
        String name,pwd;
        
        public User(int id, String name, String pwd) {
          super();
          this.id = id;
          this.name = name;
          this.pwd = pwd;
        }
      
        /* 重写equals
          在Eclipse中Shift+Alt+S选择“生成hashCod()和equals()”,以id为判断依据,选择id即可自动生成*/
        @Override
        public boolean equals(Object obj) {
          if (this == obj) //如果传递的Object与obj相等,返回true
            return true;
          if (obj == null) //如果obj为null则返回false
            return false;
          if (getClass() != obj.getClass()) //如果类型不同则返回false
            return false;
          User other = (User) obj; //以上通过则强制转型为User
          if (id != other.id) //如果id不同则返回false
            return false;
          return true; //以上通过则返回true
        }
      }
      
    • super:super是直接父类对象的引用,可以通过super来访问父类中被子类覆盖的方法或属性;使用super调用普通方法,语句没有位置限制,可以在子类中随便调用;若是构造方法的第一行代码没有显式的调用super(...)或者this(...);那么Java默认都会调用super(),含义是调用父类的无参数构造方法,这里的super()可以省略。
      package me.hzyis.test;
        
      public class Test {
        public static void main(String[] args) {
          new ChildClass().f();
        }
      }
      class FatherClass {
        public int value;
        public void f(){
          value = 100;
          System.out.println ("FatherClass.value="+value);
        }
      }
      class ChildClass extends FatherClass {
        public int value;
        public void f() {
          super.f(); //调用父类对象的普通方法,不加super则调用本类的f()
          value = 200;
          System.out.println("ChildClass.value="+value);
          System.out.println("ChildClass.super.value="+super.value); //调用父类对象的成员变量
        }
      }
    • 继承树追溯:由于构造方法第一句总是super(...)来调用父类的对应的构造方法,所有构造方法调用顺序是向上追溯直到Object,然后再依次向下执行类的初始化块和构造方法,知道当前子类为止。属性/方法查找顺序是查找当前类,如果没有再向上查到父类,直到Object,如果还是没有则报错。
      package me.hzyis.test;
      
      public class Test {
        public static void main(String[] args) {
          System.out.println("开始创建一个ChildClass对象......");
          new ChildClass();
        }
      }
      class FatherClass {
        public FatherClass() {
          System.out.println("创建FatherClass");
        }
      }
      class ChildClass extends FatherClass {
        public ChildClass() {
          System.out.println("创建ChildClass");
        }
      }