A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张迁 中级黑马   /  2013-5-6 21:02  /  2000 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张迁 于 2013-5-7 21:34 编辑

为什么运行时有classcastException异常呢?
  1. class WenTi {
  2.         public static void main(String[] args) {
  3.                 Fu f = new Fu();
  4.                 Zi z =(Zi)f;
  5.                 z.show();
  6.         }
  7. }

  8. class Fu{
  9.         public void show(){
  10.                 System.out.println("Hello world!");
  11.         }
  12. }
  13. class Zi extends Fu{
  14.         public void show(){
  15.                 System.out.println("Hello friends!");
  16.         }
  17. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 问题在第四行

查看全部评分

8 个回复

正序浏览

如果问题解决请再次编辑,修改为已解决,若还有疑问,请继续追问
回复 使用道具 举报
可以转型的条件是父类的引用指向子类对象,而且多态中都是父类在做变化
回复 使用道具 举报
package cn.zjx.DuoTai;


public class DuoTaiDemo {
/**
  * 多态:某一类事物存在多种形态。
  * @param args
  */
public static void main(String[] args) {
//  Fu f = new Fu();//这个是定义一个父类的对象,而并没有体现出多态,这个只能调用父类的方法
//                 
//  Zi z = (Zi) f;//这个的f是父类的对象,它只具有父类的成员方法和成员变量,无法将它转化为子类来使用
//                     //因此会有ClassCastException
    //下面这样写就ok啦 同时也体现出多态的特点
  //成员方法   编译看左边,运行看右边
  Fu f = new Zi();//将子类的特有方法隐藏 没有办法调用
  Zi z = (Zi)f;//这样就可以进行强制转换 来调用子类的特有方法啦!!!
  z.show();
}
}
class Fu {
public void show() {
  System.out.println("Hello world!");
}
}
class Zi extends Fu {
public void show() {
  System.out.println("Hello friends!");
}
}
回复 使用道具 举报
真心觉得LZ是概念还没理解透彻,多态三个条件,
1、父类引用指向子类对象;
  2、要有覆盖操作,也就是重写;
  3、需要存在继承或者实现关系;
第一个条件就是你没理解的地方
回复 使用道具 举报
冒个泡 子类不能强转为父类  第三行改为 Fu f = new Zi();
回复 使用道具 举报
ClassCastException是JVM在检测到两个类型间转换不兼容时引发的运行时异常。此类错误通常会终止用户请求。在执行任何子系统的应用程序代码时都有可能发生ClassCastException异常。通过转换,可以指示Java编译器将给定类型的变量作为另一种变量来处理。对基础类型和用户定义类型都可以转换。Java语言规范定义了允许的转换,其中大多数可在编译时进行验证。不过,某些转换还需要运行时验证。如果在此运行时验证过程中检测到不兼容,JVM就会引发ClassCastException异常。
     当应用程序代码尝试将某一对象转换为某一子类时,如果该对象并非该子类的实例,JVM就会抛出ClassCastException异常。                                                      就是你写的这一句Zi z =(Zi)f;改成这样就对了Zi z =new Zi();
回复 使用道具 举报
你忘了多态的条件了吗:一、要父类指向子类。你的是fu f=newfu(),要换为fu f=new zi()。
                      二、要有继承
                      三、重写父类的方法
回复 使用道具 举报
Fu f = new Fu();
Zi z =(Zi)f;

父类型的对象时不能转换为子类型的对象, 如果是父类引用子类对象, 再强转为子类型, 是可以的
Fu f = new Zi();
Zi z = (Zi)f;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马