Object类
1:什么是Object类
Object类的主要特点是可以解决参数的统一问题,也就是说使用Object类可以接收所有的数据类型。
在Java之中只有一个类是不存在有继承关系的,那么这个类就是Object类,也就是说所有的默认情况下都是Object子类(以下两种定义方式相同):
class Person { } 等价于 : class Person extends Object { }
在Object类设计的时候考虑到了所有继承的问题,所以该类提供有无参构造方法,这样所有的类在定义时即便不知道Object的存在也不会出现构造方法调用失败的语法错误。
2:Object是所有类的父类
既然Object是所有类的父类,那么这种情况下就可以使用Object类接收所有的子类对象。(代码如下)
//观察Object类接收所有子类对象
public class JavaDemo {
public static void main(String args[]) {
Object obj = new Person() ; // 向上转型
if (obj instanceof Person) {
Person per = (Person) obj ;
System.out.println("Person对象向下转型执行完毕。") ;
}
}
}
如果一个程序的方法要求可以接收所有类对象的时候就可以利用Object实现处理;
在Java设计的过程之中对于所有的引用数据类型实际上都可以使用Object类进行接收,包括数组也可以(代码如下)。
public class JavaDemo {
public static void main(String args[]) {
Object obj = new int [] {1,2,3} ; // 向上转型
if (obj instanceof int[]) { // 是否为整型数组
int data [] = (int []) obj ; // 向下转型
for (int temp : data) {
System.out.print(temp + "、") ;
}
}
}
}
//Object是一个万能的数据类型,它更加适合于程序的标准设计。
3:获取对象设计
Object虽然是一个类,但是这个类本身也提供有一些方法,例如:toString();该方法可以获取一个对象的所有信息,public String toString().
//观察默认的构造方法
package 开始面试;
class Person { }
public class Demo{
public static void main(String args[]){
Person per = new Person();
System.out.println(per);
System.out.println(per.toString());//Object类继承而来的方法。
}
}
//结果:
开始面试.Person@3c679bde
开始面试.Person@3c679bde
通过上述的代码:发现之前进行对象直接输出的时候多调用的方法就是toString()方法,所以这个方法调用和不调用的效果是一样的。
所以以后的开发之中对象信息的获取可以直接覆写此方法。
class Person {
private String name ;
private int age ;
public Person(String name,int age) {
this.name = name ;
this.age = age ;
}
@Override
public String toString() {
return "姓名:" + this.name + "、年龄:" + this.age ;
}
}
public class Test {
public static void main(String args[]) {
Person per = new Person("张三",20) ;
System.out.println(per) ;
}
}
//姓名:张三、年龄:20
在以后编写Java类的过程中只需要覆写toString()方法即可;
4:对象比较:equals()
Object类之中另外一个比较重要的方法就是在于对象比较的处理上,所谓的对象比较功能是比较两个对象的内容是否完全相同:假设说现在有两个Person对象,要想确认这两个对象是否一致,但是两个对象本身会有两个不同的内存地址数值,所以此时应该是通过内容的比较完成的。
//对象比较的基础实现
class Person {
private String name ;
private int age ;
public Person(String name,int age) {
this.name = name ;
this.age = age ;
}
public String toString() {
return "姓名:" + this.name + "、年龄:" + this.age ;
}
public String getName() {
return this.name ;
}
public int getAge() {
return this.age ;
}
}
public class JavaDemo {
public static void main(String args[]) {
Person perA = new Person("张三",20) ;
Person perB = new Person("张三",20) ;
if (perA.getName().equals(perB.getName()) &&
perA.getAge() == perB.getAge()) {
System.out.println("是同一个对象。") ;
} else {
System.out.println("不是同一个对象。") ;
}
}
}
//此时的确实现了对象比较的功能,但是这个功能比较麻烦:
1:由于需要进行对象比较的时候要讲每一个属性都进行判断,所以在外部要调用大量的getter()方法;
2:对象比较应该是一个类内部所具备的功能,而不应该在外部定义;
3:对象比较:public boolean equals(Object obj),可以接收所有类型,默认情况下该方法只是进行了两个对象的地址判断
public boolean equals(Object obj){
return(this==obj);
}
对于实际的使用者而言,如何要想正确实现判断处理,那么就必须在子类中的覆写方法,并且进行属性判断。
//观察覆写equals()方法
class Person {
private String name ;
private int age ;
public Person(String name,int age) {
this.name = name ;
this.age = age ;
}
public String toString() {
return "姓名:" + this.name + "、年龄:" + this.age ;
}
// equals()方法这个时候会有两个对象:当前对象this、传入的Object
public boolean equals(Object obj) {
if (!(obj instanceof Person)) {
return false ;
}
if (obj == null) { // 不关心null的比较
return false ;
}
if (this == obj) { // 同一个地址
return true ;
}
Person per = (Person) obj ; // 目的是为了获取类中的属性
return this.name.equals(per.name) && this.age == per.age ;
}
}
public class JavaDemo {
public static void main(String args[]) {
Person perA = new Person("张三",20) ;
Person perB = new Person("张三",20) ;
System.out.println(perA.equals(perB)) ;
}
}
String类是Object类的子类,那么这个类里边实际上已经覆写了equals()方法。