自学JAVA知识点总结 - 初级-第19页 - Aaron's Home -黄泽雨个人博客

记录与分享

自学JAVA知识点总结 - 初级

编程语言 JAVA

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

 

 


↓ 点击翻页 ↓

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

分享