Object类
在Java中的所有类都是从Object这个类继承出来的,Object类是所有类的源头,是所有类的父类。
你可以想象自己写的类是这样声明的:
public class Dog extends Object {}
Object类的部分方法:
1.
equals(Object o) //判断是否相等
Dog a = new Dog();
Cat c = new Cat();
boolean b = a.equals(c); //false
2.
getClass()
Cat c = new Cat();
System.out.println(c.getClass()); //class cat ,告诉你此对象是从哪里被初始化的
3.
hasCode()
Cat c = new Cat();
System.out.println(c.hasCode()); // 8202111 ,列出此对象的哈希代码,你可以把它想象成一个唯一的ID
4.
toString()
Cat c = new Cat();
System.out.println(c.toString()); //列出类的名称和一个我们不关心的数字
关于Object类的几点说明:
- Object类不是抽象类
- Object类的部分方法可以被覆盖,被标记为final的方法不能被覆盖,强烈建议用自己写的类去覆盖掉hashCode(),equals(),toString()
- ArrayList方法是通用的,入参或返回类型为object,ArrayList<Dog>是用于限制它的类型,表明此ArrayList受限只能保存Dog对象,在java5.0之前无法限制它的类型。
- Object类有两个主要的目的,作为多态让方法可以应付多种类型的机制,以及提供Java在执行期对任何对象都有需要的方法的实现程序代码(让所有的类都会继承到)
使用Object类型的多态引用的代价:
- 任何从ArrayList取出的东西都会被当作Object类型的引用而不管它原来是什么,编译器无法将此对象识别为Object以外的事物。
- 编译器只管引用的类型,而不是对象的类型,编译器是根据引用类型来判断有哪些method可以调用,而不是根据Object确实的类型
public void go() {
Dog d = new Dog();
Dog a = getObject(d); //这是错误的,无法过关,虽然返回了同一个Dog,但编译器认为这只能赋值给Object类型的变量
}
public Object getObject(Object o) {
return o; //返回了同一个引用,但类型已经转换为Object了
}
如何将Object类转换为原来的类型
ArrayList<Object> myDogs = new ArrayList<Object>();
Dog d = new Dog();
Dog a = (Dog) mydogs.get(0)
如果你真的确定它是个Dog,可以使用(Dog)将类型转换为Dog.
如果你不能确定它是Dog,可以使用instanceOf这个运算符来检查,若是类型转换错了,你会在执行期遇到ClassCastException异常并且终止。
if (o instance of Dog) {
Dog a = (Dog) o;
}