在java语言设计过程中,为了方便操作类型的统一,也为了方便为每一个类定义一些公共操作,所以专门设计了一个公共的Object父类(此类是唯一一个没有父类的类,但确是所有类的父类),所以利用class关键字定义的类全部都默认继承自Object类。
既然所有类全部都是Object类的子类,那么也就意味着所有类的对象都可以利用向上转型的特点为Object类对象实例化。
范例:对象向上转型为Object类型
public class Object182 {
public static void main(String[] args) {
Object ob=new Person1();//向上转型
if(ob instanceof Person1) {
Person1 on=(Person1) ob;
on.sun();
}
}
}
本程序给出了Object接收子类实例化对象的操作形式,由于所有的对象都可以通过接收Object接收,这样设计的优势在于:当某些操作方法需要接收任意类型时,那么最合适的参数类型就是Object。
提示:Object可以接收所有引用数据类型
范例:利用Object接收数组
public class Object182b {
public static void main(String[] args) {
Object obj=new int [] {1,2,3};//向上转型
if(obj instanceof int[]) { //是否为整形数组
int date []=(int [])obj;
for(int temp:date) {
System.out.print(temp+"、");
}
}
}
}
执行结果
1、2、3、
也可以接收接口
8.6.1获取对象信息
在Object类中提供有一个toString()方法,利用此方法可以实现对象信息的获取,而该方法是在直接进行对象输出时的默认被调用的
范例:获取对象信息
package com.lxh.eightchapter;
public class Object182c {
private String name;
private int age;
public void SetName(String name) {
this.name=name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age=age;
}
public int getAge() {
return age;
}
public Object182c() {}
public Object182c(String name,int age) {
this.name=name;
this.age=age;
}
@Override
public String toString() {
return "Object182c [name=" + name + ", age=" + age + "]";
}
}
public class Object182cJava {
public static void main(String[] args) {
Object182c per=new Object182c("李双双",33);
System.out.println(per); //直接输出对象调用toString方法
}
}
执行结果
Object182c [name=李双双, age=33]
本程序在子类中根据自己的实际需求覆写了toString()方法,这样当对象进行打印时,就可以直接调用子类覆写过得toString方法获取相关对象信息。
提示:当一个对象被直接输出时,默认输出的是对象编码。toString()方法利用相应的反射机制和对象编码获取一个对象信息,所以当子类不在覆写toString()方法时 ,toString()方法会返回“类名称@7b1d7fff”类似的信息。
8.6.2对象比较
对象比较的主要功能:比较两个对象的内容是否完全相同。
假设有两个Person 对象,这两个对象由于分别使用了关键字new开辟堆内存空间,所以要确认这两个对象是否一致,就需要将每一个成员属性依次进行比较,对于这样的比较,在Object类中提供了一个标准的方法。
对象比较标准方法:public boolean equals(Object obj)
Object类中考虑到设计的公共性,所以equals()方法中两个对象的比较是基于地址数值判断(“对象==对象”地址数值判断)实现的,如果子类有对象比较的需求,那么只需覆写此方法即可实现。
提示:String类也是覆写了equals()方法。
String是Object子类,所以在String类中的方法equals()方法(方法定义:public boolean equals(Object obj))实际上就是覆写了Object类中的equals()方法。
范例:覆写equals()方法
package com.lxh.eightchapter;
public class Person2 {
private String name;
private int age;
public void setName(String name) {
this.name=name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age=age;
}
public int getAge() {
return age;
}
public Person2() {
}
public Person2(String name, int age) {
this.name = name;
this.age = age;
}
//equals()方法这个时候会有两个对象;当前对象this、传入的object
public boolean equals(Object obj) {
if(!(obj instanceof Person2)) { //实例类型判断
return false;
}
if(obj==null) { //null判断
return false;
}
if(this==obj) { //地址相同,则认为是同一对象
return true;
}
//获取子类中的属性
Person2 per=(Person2)obj; //获取子类属性
return this.name.equals(per.name)&&this.age==per.age;
}
}
public class Person2java {
public static void main(String[] args) {
Person2 perA=new Person2("张三",20);
Person2 perB=new Person2("张三",20);
System.out.println(perA.equals(perB)); //对象比较
}
}
执行结果
true
覆写equals()方法即可实现对象比较