- Object类是Java默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的。Object类是所有类的父类,所有类都默认继承Object类,即所有类的对象都可以使用Object进行接收。
class Person {}
class Student {}
public class JieShouDuiXiang {
public static void main(String[] args) {
fun(new Person());
fun(new Student());
}
public static void fun(Object obj) {
System.out.println(obj);
}
}
所以在开发之中,Object类是参数的最高统一类型。但是Object类也存在有如下的定义好的一些方法:
1. 获取对象信息 – toString()
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class HuoQuDuiXiangXinXi {
public static void main(String[] args) {
fun(new Person("张三", 20));
fun("Hello");
}
public static void fun(Object obj) {
System.out.println(obj.toString());
System.out.println(obj);
//不管是obj.toString()还是直接obj,结果都是一样的!!!
}
}
所以在使用System.out.println()系统输出对象时,默认会调用该对象的toString方法。所有类都是Object的子类,Object有toString方法,则所有类都有toString方法。
- 那么我们就像知道默认的toString方法到底干了个啥事儿?
//默认的Object类的toString方法
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
若自定义类需要进行内容的输出,需要覆写toString()
方法。
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//覆写之后的toString方法
public String toString() {
return "姓名是:"+this.name+"年龄是:"+this.age;
}
}
public class HuoQuDuiXiangXinXi {
public static void main(String[] args) {
fun(new Person("张三", 20));
fun("Hello");
}
public static void fun(Object obj) {
System.out.println(obj.toString());
}
}
- 那么现在问题就是为什么String类可以输出内容???
- 一定是因为String类的内部覆写了toString方法!!
//String类覆写后的toString方法
public String toString() {
return this;//输出当前对象不再输出地址
}
***** 2. 比较两个对象内容 – equals()
Object类提供的equals方法默认比较两个对象的地址是否相同。String类对象的比较使用的是equals()方法,实际上String类的equals()方法就是覆写的Object类中的equals()方法。
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Test {
public static void main(String[] args) {
Person per1 = new Person("张三", 20);
Person per2 = new Person("张三", 20);
System.out.println(per1.equals(per2));
//equals比较的不应该是内容吗?内容明明相等为什么结果是false???
}
}
因为Person类是我们自己写的,调用的是Object类的equals方法。
- 那么Object类的equals方法到底干了个啥事儿???
//默认的Object类的equals方法
public boolean equals(Object obj) {
return (this == obj);
//"=="比较的是地址,per1和per2肯定地址不一样,所以返回false
//没覆写的情况下相当于 per1 == per2?
}
所以Object类提供的equals方法默认比较两个对象的地址是否相同!!和"=="一样的。
- 如何进行内容的比较?即如何覆写equals方法?
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//覆写之后的equals方法
public boolean equals(Object obj) {
//判断地址是否相等,相当于自己跟自己比
if(obj == this) {
return true;
}
//判断传进来的obj对象能否指向Person,"!"表示传进来的对象不是Person对象
//不是一个类就没必要比较属性
if(!(obj instanceof Person)) {
return false;
}
//此时传进来的obj一定是Person对象且和this不是一个地址
//此时需要比较两个Person对象的内容,现在还在Objectlei中需要向下转型转回Person对象后比较两者的属性内容
Person per = (Person) obj;
return this.age == per.age && this.name.equals(per.name);
}
}
public class Test {
public static void main(String[] args) {
Person per1 = new Person("张三", 20);
Person per2 = new Person("张三", 20);
Person per3 = new Person("张三", 21);
System.out.println(per1.equals(per2));
System.out.println(per1.equals(per3));
}
}
3. 接收引用数据类型
在之前已经分析了Object可以接收任意的对象,因为Object是所有类的父类,但是Object并不局限于此,它可以接收所有数据类型,包括:类、数组、接口。
① 使用Object来接收数组对象
public class JieShouShuZu {
public static void main(String[] args) {
//向上转型,Object类接收了一个数组
Object obj = new int[]{1, 2, 3, 4, 5};
//向下转型,强转
int[] data = (int[]) obj;
for(int i : data) {
System.out.print(i + "、");
}
}
}
② 使用Object来接收接口对象
而Object可以接收接口是Java中的强制要求,因为接口本身不能继承任何类。
interface IMessage {
void getMessage();
}
class MessageImpl implements IMessage {
public void getMessage() {
System.out.println("Hello world");
}
public String toString() {
return "你好";
}
}
public class JieShouJieKou {
public static void main(String[] args) {
//MessageImpl向上转型
IMessage m = new MessageImpl();
//接口向Object转型
Object obj = m;
System.out.println(m);
//向下转型
IMessage msg = (IMessage) obj;
msg.getMessage();
}
}
Object真正达到了参数的统一,如果一个类希望接收所有的数据类型,就是用Object完成。