3.15、Object类

  1. 3.15、Object类

3.15、Object类

在Java中一切都是继承关系,那么既然一切都是继承关系。

class Person{}

如果一个类没有明确的指定哪个父类,则默认情况下就是继承Object类,实际以上的语法应该写成如下形式:

class Person extends Object{}

那么,证明,任何类对象都可以使用Object进行接收。

class Person extends Object{
    
}
public class Demo{
    public static void main(String args[]){
        Object obj1 = new Person();
        Object obj2 = "hellow";
    }
}

那么,对于Object接收来讲,不光可以接收类的引用,只要是引用数据类型都可以使用Object类接收。

interface National{
}
class Person extends Object implements National{
}
public class Demo{
    public static void main(String args[]){
        National na = new Person();	//子类为接口实例化
        Object obj = na;	//使用Object接收接口实例
        National temp = (National)obj;
    }
}

观察使用Object接收数组类型的数据:

public class Demo{
    public static void main(String args[]){
        int i[] ={1,2,3,4,5,6,7,8};	//数组
        Object obj = i;		//使用Object接收数组
        int x[] = (int[])obj;	//向下转型
        for(int j=0;j<x.length;j++){
            System.out.print(x[i] + "、 ");
        }
    }
}

Object类的主要功能不止于此,对于一个完整的类来讲,应该覆写Objcet类中的以下三个方法:

  • toString():对象打印时候调用:public String toString()

  • equals():对象比较时调用,实际上String类就已经覆写好了此方法。

    public boolean equals(Object obj)

  • hashCode(),暂时不看

先来看toString方法:

class Person{
    public String toString(){		//覆写了toString()方法
        return "Hello";
    }
}
public class Demo{
    public static void main(String args[]){
        System.out.println(new Person());
    }
}

发现此时直接输出对象时,实际上就是调用了类中的toString()方法,那么因为此方法被子类覆写了,所以最终调用的是被覆写过的方法。

也就是说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 Demo{
    public static void main(String args[]){
        System.out.println(new Person("张三",30));
    }
}

在Object类中标准的对象比较方法就是equals,那么如果要进行对象的比较的话,在系统中找的也是equals方法。

class Person{
    private String name;
    private int age;
    public boolean equals(Object obj){		//是完成对象的比较操作
        if(this==obj){	//两个地址相等
            return true;
        }
        if (!(obj instanceof Person)){      //不是同一个类型
            return false;
        }
        Person per = (Person)obj;
        if (this.name.equals(per.name)&&this.age==per.age){
            return true;
        }else {
            return false;
        }
    }
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    public String toString(){       //覆写了toString()方法
        return "姓名:" + this.name + ",年龄:" + this.age;
    }
}
public class Demo00 {
    public static void main(String args[]) {
        System.out.println(new Person("张三",30).equals("hello"));
    }
}

Object可以接收任意类型的对象引用。

abstract class A{
    public A(){
        this.print();
    }
    public abstract void print();
}
class B extends A{
    private int x = 100;
    public B(int x){
        this.x = x;
    }
    public void print(){
        System.out.println("x=" +x);
    }
}

public class Demo02 {
    public static void main(String args[]) {
        A a = new B(10);
    }
}

子类对象的实例化过程:先去调用父类中的构造方法,之后在执行子类自己的构造方法

父类的构造方法执行完之后实际上是为了父类中的属性初始化了,但是未执行完的话,子类的构造方法就永远不可能调用,那么,子类中的所有属性都无法初始化,无法初始化,那么默认值就是0


转载请注明来源