日期:2014-05-20  浏览次数:20643 次

子类转换成父类方法不丢失么?
最近在淘宝上花了15元大洋买了本java编程思想,对其中的转换很不理解。

子类继承了父类,那么子类也扩展了一些父类所没有的方法。当子类转换成父类的时候,一些方法应该丢失了啊。为什么还能转换回来呢?

例如Object类,它只有那么多方法。而ArrayList类则是继承了Object类。

ArrayList a = new ArrayList();
  ...
Object obj = (Object)a; 

当转换成obj的时候,a的一些ArrayList方法应该都没有了啊。

为什么转回来之后,例如ArrayList b=(ArrayList)obj;

b没有丢失任何方法?

谢谢大家咯~

------解决方案--------------------
public class Test {
public static void main(String[] args) {
Son s = new Son();
Parent p = (Parent)s;
p.print();
//p.foo();
}
}
class Parent{
void print(){
System.out.println("parent print");
}
}
class Son extends Parent{
void print(){
System.out.println("son print");
}
void foo(){
System.out.println("son foo()");
}
}

------解决方案--------------------
向下转型是安全的,即使

Object obj = new Object() ;
ArrayList b = (ArrayList)obj ;

因为 b是 ArrayList类型的引用,当然有访问ArrayList中的属性方法啦,因为 ArrayList是 Object的子类,所以是安全的,只是 ArrayList中的一些属性可能是null
------解决方案--------------------
多态,编译时多态,运行时多态,类型转化了,但是对象实例没变
------解决方案--------------------
类型转化了,但是对象实例没变,即使对象实例所存放的内存空间地址还是一样的
------解决方案--------------------
所谓强制转型

你没有改变对象
只是改变了引用而已

父类引用不能访问子类方法
所以当你用父类引用指向子类对象时,不能访问子类的方法
而当你转回子类引用指向子类对象时,又可以访问子类方法了

记住,这个过程中对象一直没变过,一直都是那个子类对象
变的只是引用