Java Object类

  • Object类是一个通用类,Java所有的类都是从Object类继承出来的。所以可将创建对象的过程理解为

    public class Cars extends Object{
        // 继承Object
    }
  • Object类不是一个抽象类,部分方法是可以被覆盖的。

  • Object类中有许多有用的方法

    • equals() 比较两个类是否相等
    • getClass() 告诉你对象是从哪里被初始化的
    • hashCode() 列出此对象的哈希代码
    • toString() 列出类的名称和一个我们不关心的数字
  • Object类的作用
    • 作为多态让方法可以应付多种类型的机制
    • 提供Java在执行期对任何对象都有需要的方法的实现程序代码(让所有类都可以被继承到)

Object类解释多态

// 以下代码是合法的
ArrayList<Car> myCars = new ArrayList<Car>(); // 保存Car的ArrayList
Car BMW = new Car(); // 新建一个Car
myCars.add(BMW); // 装进ArrayList
Car M3 = myCars.get(0) // 将Car赋值给新的Car引用变量

// 于是学了Object后会设想,能不能填入Object使其可以保存任意一种ArrayList呢?
// 于是考虑能否这么写代码?
ArrayList<Object> myCars = new ArrayList<Object>();
Car BMW = new Car();
myCars.add(BMW);
// 目前的代码没有问题,但是再做以下操作便会发生问题
Car M3 = myCars.get(0);
// 编译器会报错,为什么呢?
// 放进去的是宝马,但是从ArrayList<Object>取出来的对象都会被当成是Object这个类的实例

这样,我们看下面这一段代码也变得清晰了

// 这一段代码是不合法的
public void go(){
    Dog aDog = new Dog();
    Dog sameDoge = get Object(aDog);
}

public Object getObject(Object o){
    return o;  // 返回的是同一个引用,但是类型已经转换为Object了
}
  • 不难看出,编译器是根据引用类型来判断有哪些method可以调用。详细的说,对象会带有从父类继承下来的所有东西,这一代表每个对象不论实际类型都会是Object的一个实例。所以除了它本身的类型外,也可以当作Object来处理。但是引用的是什么,就只能调用什么!子类里写的新方法就只能引用子类才能调用!

  • 如下代码,十分明显了

    public class Dog{
        void yell(){
            // code
        }
    }
    Dog a = new Dog();
    Object o = a;
    o.equals(a);
    >>> True
    // 二者的对象类型和地址都是相同的,因为这是赋值而不是在内存上开创空间
    o.yell();
    >>> Wrong
    // 这样会报错,因为引用的是Object类,里面没有yell()
01-26 02:46