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()