标签:tcl 不能 编译 赋值 调用 object类 oge 执行 十分
Object类是一个通用类,Java所有的类都是从Object类继承出来的。所以可将创建对象的过程理解为
public class Cars extends 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()
标签:tcl 不能 编译 赋值 调用 object类 oge 执行 十分
原文地址:https://www.cnblogs.com/scyq/p/11604478.html