Java Object类
-
Object类是一个通用类,Java所有的类都是从Object类继承出来的。所以可将创建对象的过程理解为
public class Cars extends Object{ // 继承Object }
-
Object类中有许多有用的方法
- Object类的作用
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()