自学JAVA知识点总结 - 初级

编程语言5天前更新 AaronHzy
157 0

面向对象 - 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");
      }
    }

© 版权声明

相关文章