程序1:
public class Father{
Son[] s = new Son[5];
Father[] f = (Father)s;
}class Son extends Father{


}
程序2:
public class Father{
Son s = new Son();
Father f = (Father)s;
}class Son extends Father{


}
为什么程序1编译出错而程序2编译通过?这个问题说明了数组对象和一般对象有什么不同呢?对于一般对象而言,子类对象又为什么能够强制类型转换成父类对象?

解决方案 »

  1.   

    Father[] f = (Father)s;Father[] f = (Father[])s;
      

  2.   

    第二个例子不用强制转换。
    父类引用指向子类对象。
    public class Father{
    Son s = new Son();
    Father f = s;
    }
    class Son extends Father{
    }第一个例子应该这么写。
    public class Father{
    Son[] s = new Son[5];
    Father[] f = (Father[])s;
    }class Son extends Father{
    }
      

  3.   

    父类引用指向子类对象的时候。都不用强制转换。会进行自动的向上转型。第一个例子也可以这么写。public class Father{
    Son[] s = new Son[5];
    Father[] f =s;
    }class Son extends Father{
    }
      

  4.   

    对不起楼上的各位朋友,我上面写的代码弄错了,在此改一下。
    程序1:public class Father{
    Father f = new Father();
    Son s = (Son)f;
    }class Son extends Father{
    }程序2:
    public class Father1{
    Father[] f = new Father[5];
    Son[] s = (Son[])f;
    }class Son extends Father{
    }现在经过修改两段代码都能编译通过了。谢谢楼上各位朋友的解答。我对自己所犯的错误感到抱歉。
    现在又有了新的疑惑,数组对象和一般对象之间有区别吗?如果从内存上分析他们的区别在哪?
      

  5.   

    用泛型链表 ArrayList<? extends E>