Object类的基本概念
虽然参数转型可以解决参数的统一问题,但是面对Java之中如此之多的开发类,所以现在就面临这样一个问题,参数对象要怎样选择才能保存所有的类对象呢?为此,考虑到此种情况,Java中提供了Object类,此类的定义如下:
public class Object
可以发现在整个的Java中,只有Object类在定义的时候没有定义父类,而其他的所有类都是Object类的子类。也就是说在Java中除了Object类之外,其他的类都存在有继承关系。
public class Person{} | public class Person extends Object{} |
---|
理论上如果定义一个类的时候没有继承任何的父类,那么其将默认继承Object类。这样的直接好处是所有的对象都可以使用Object类来接收。
范例:利用Object接收对象
class Person{
}
public class Hello{
public static void main(String args[]){
Object obj = new Person();//向上转型
}
}
利用Object可以实现最终的参数统一。
清楚了Object类的作用之后,下面要完善一些操作:
- 在简单Java类的时候需要提供有一个getInfo()方法已返回对象信息;
- 在进行简单Java类对象的比较时要准备一个compare()方法进行比较。
那么从现在开始以上的两个方法需要换名了,在Object类里面定义有以下的两个匹配方法 - 取得对象信息: public String toString();
- 对象比较:publicboolean equals(Object obj)。
取得对象信息(toString()方法)
如果说现在直接输出一个对象,默认输出的是一个对象地址编码。
范例:观察默认的toString()
class Person{
}
public class Hello{
public static void main(String args[]){
Person p = new Person();
System.out.println(p);//Person@15db9742
System.out.println(p.toString());//Person@15db9742
}
}
通过此时的情况可以发现,在默认情况下如果要输出一个对象,都会执行toString的方,不管是否显示调用此方法。于是Object类对于此方法就有一个自己的默认实现,虽然不知道每个对象输出时都需要哪些,但是至少知道,每个对象存在都会有一个地址编码,所以默认的输出是对象的编码信息。
如果用户现在不希望输出编码,而希望输出具体的内容,则可以进行方法的覆写。
范例:覆写toString()方法
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 class Hello{
public static void main(String args[]){
Person p = new Person("张三",30);
System.out.println(p);//姓名:张三,年龄:30
}
}
toString()方法是输出调用的。
equals()方法
对象比较在之前使用过compare()方法进行表示,而且最为重要的是在之前实现对象比较时比较的流程是:地址、是否为空、属性是否相同。
范例:实现对象比较
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public boolean equals(Object obj){
if(this==obj){//地址相同
return true;
}
if(obj==null){//没得比
return false;
}
if(!(obj instanceof Person)){
return false;//两个对象没关系
}
Person per = (Person) obj;
if (this.name.equals(per.name)&&this.age==per.age){
return true;
}return false;
}
public String toString(){
return "姓名:"+this.name+",年龄:"+this.age;
}
}
public class Hello{
public static void main(String args[]){
Person p1 = new Person("张三",30);
Person p2 = new Person("张三",30);
System.out.println(p1.equals(p2));
System.out.println(p1.equals("猪、大猪、黑猪"));
}
}
从此以后,所编写对象比较操作,都以Object类的equals()方法为主。
Object类可接收一切引用数据类型
Java的引用类型包含:数组、类、接口。现在已经证明了,所有的类对象都可以使用Object进行接收,数组和接口也可以被Object接收。
范例:利用Object接收数组对象
public class Hello{
public static void main(String args[]){
Object obj = new int[]{1,2,3};//利用Object接收整型数组,向上转型
if(obj instanceof int[]){//对象是否是int数组
int data [] = (int[]) obj;//向下转型
for(int x=0;x<data.length;x++){
System.out.println(data[x]);
}
}
}
}
除了可以接收数组外,也可以接收接口。
范例:辅助概念
interface A{
public void printA();
}
interface B{
public void printB();
}
class X implements A,B{
public void printA(){
System.out.println("AAAAAAAAAAAAAAAAAA");
}
public void printB(){
System.out.println("BBBBBBBBBBBBBBBBBB");
}
}
public class Hello{
public static void main(String args[]){
A a = new X();//向上转型
B b = (B) a;//虽然A与B没有关系,但是X是B的子类;
b.printB();
}
}
按照以上的思路来解决Object接收接口对象的问题。
范例:用Object接收接口对象
interface A{
public void printA();
}
class X extends Object implements A{
public void printA(){
System.out.println("AAAAAAAAAAAAAAAAAA");
}
}
public class Hello{
public static void main(String args[]){
A a = new X();//向上转型
Object obj=a;//向上转型
A temp = (A) obj;//向下转型
temp.printA();
}
}
Object所有引用数据类型都可以接收,对于数据的统一性操作上更加方便了。
总结
- Object类是所有类的父类,可以接收所有引用数据类型;
- Object类提供的toString()与equals()方法可以应用在简单Java类之中。