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