Object 类是 Java中最为常用的一个系统类,利用 Object 类可以实现参数统一。
1 基本作用
- 在 Java 中所有的类都有一个公共的父类 Object 类,一个类只要没有明显的继承一个类,则肯定是 Object 类的子类。如下两行代码的含义都是一样的:
class Person extends Object{ }
class Person { }
- Object 类的主要方法如表:
序号 | 方法名称 | 类型 | 描述 |
1 |
| 构造 | 构造方法 |
2 |
| 普通 | 对象比较 |
3 |
| 普通 | 取得 hash 码 |
4 |
| 普通 | 对象打印时调用 |
2 主要方法
实例 1 代码:
package self.learn.objectdemo;
public class Demo {
}
package self.learn.objectdemo;
public class ObjectDemo01 {
public static void main(String[] args) {
Demo demo = new Demo();
System.out.println("不加 toString()输出"+demo);
System.out.println("加 toString()输出"+demo.toString());
}
}
运行结果截图:
上面的程序输出了一些地址信息,从程序的运行结果可以看出,加与不加 toString()方法最终的输出结果是一样的,也就是说输出的时候一定会调用 Object 类中的 toStrin() 方法打印内容。
实例 2 代码:应用 toString()方法取得一些内容
package self.learn.objectdemo;
public class Person{ // 定义 Person 类实现比较器
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() { // 覆写 toString() 方法
//return "Person [name=" + name + ", age=" + age + "]";
return "姓名:"+this.name+";年龄:"+this.age;
}
}
package self.learn.objectdemo;
public class ObjectDemo01 {
public static void main(String[] args) {
Person person = new Person("李白", 18);
System.out.println("对象的信息"+person);
}
}
运行结果截图:
程序中的 Person 类中的 toString()方法,这样直接输出对象的时候调用的是被子类覆写过的 toString()方法。equals()方法的主要功能是用于对象的比较。
Object 类提供的 equals()方法默认是比较地址
在 Object 中的 equals()方法实际上也是可以使用的,但是其默认使用的是按地址进行比较,并不能对内容进行比较。
实例 3 代码:对象的比较操作
package self.learn.objectdemo;
public class Person{ // 定义 Person 类实现比较器
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) { //覆写 Object 类中的 equals()方法
if(this == obj) { // 如果两个对象的地址相等,则肯定是同一个对象
return true;
}
if(!(obj instanceof Person)) { // 判断传递进来对象是否是 Person 实例
return false; // 如果不是,则直接返回 false
}
Person per = (Person)obj; // 将传递进来的对象向下转型
if(per.name.equals(this.name)&&per.age == this.age) {
return true;
}else {
return false;
}
}
@Override
public String toString() { // 覆写 toString() 方法
//return "Person [name=" + name + ", age=" + age + "]";
return "姓名:"+this.name+";年龄:"+this.age;
}
}
运行结果截图:
在 Person 类中覆写了 equals()方法,首先判断传递进来的对象与当前对象的地址是否相等,如果相等,则肯定是同一个对象,因为在 equals() 方法传递的参数是 Object 类型,所以任何对象都可以接收,这样在对象进行向下转型之前就必须判断,判断传递进来的对象是否是 Person 实例,如果不是,则直接返回 false;如果是,则将各个属性依次进行判断。
在编写测试方法的时候,为了测试程序的合理性,传入了一个字符串类型的对象,从结果中可以清楚的看见,因为字符串不是 Person 类型,所以直接返回了 false。
3 接收任意引用类型的对象
既然 Object 类是所有对象的父类,则肯定所有对象都可以向 Object 进行转换,在这其中也包含了数组和接口类型,即一切的引用数据类型都可以用 Object 进行接收。
实例 4 代码:使用 Object 接收接口实例
package self.learn.objectdemo;
public interface A { // 定义接口 A
public String getInfo(); // 定义抽象方法
}
package self.learn.objectdemo;
public class B implements A { // 子类实现接口
@Override
public String getInfo() {
return "Hello World!";
}
}
package self.learn.objectdemo;
public class ObjectDemo01 {
public static void main(String[] args) {
A a = new B(); // 为接口实例化
Object obj = a; // 对象向上转型
A x = (A)obj; // 对象向下转型
System.out.println(x.getInfo());
}
}
运行结果截图:
通过上面的代码可以发现,虽然接口不能继承一个类,但是依然是 Object 类的子类,因为接口本身是引用数据类型,所以可以向上转型。
同理,也可以使用 Object 接收一个数组,因为数组本身也是引用数据类型。
实例 5 代码:使用 Object 接收数组
package self.learn.objectdemo;
public class ObjectDemo01 {
public static void main(String[] args) {
int temp[] = {1,3,5,7,0}; // 定义数组
Object obj = temp; // 使用 Object 接收数组
Print(obj);
}
public static void Print(Object o) { // 接收一个对象
if(o instanceof int[]) { // 判断对象类型
int x[] = (int [])o; // 向下转型
for(int i = 0; i < x.length; i++) { // 循环输出
System.out.print(x[i]+"、");
}
}
}
}
运行结果截图:
上面的程序使用 Object 接收一个整型数组,因为数组本身属于引用数据类型,所以可以使用 Object 接收数组内容,在使用 Print() 方法输出的时候通过 instanceof 判断类型是否是一个整型数组,然后进行输出。
Object 类在实际开发中的作用
因为 Object 类可以接收任意的引用数据类型,所以在很多类库设计上都采用了 Object 作为方法参数,这样操作起来会比较方便。