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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Zenith 中级黑马   /  2013-12-30 23:29  /  2229 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Exception in thread "main" java.lang.ClassCastException:

QQ截图20131230232727.png (76.21 KB, 下载次数: 10)

Exception in thread "main" java.lang.ClassCastException:

Exception in thread "main" java.lang.ClassCastException:

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 神马都是浮云

查看全部评分

5 个回复

倒序浏览
这里怎么发生的异常阿?    Fu f = new  Zi();   是向上转型 , 那 向下转型 不是也可以的吗 ?不明白  ,求解   谢谢了
回复 使用道具 举报
Pencil pen=new Pencil();//父类引用指向父类对象(不是多态),你不能把父类的实例向下强转为子类!!

评分

参与人数 1黑马币 +3 收起 理由
FFF + 3 骚 年,你的分咋丢了那么多?

查看全部评分

回复 使用道具 举报
语法没有错误,所以编译不会报错。但是,b作为父类的引用,可以指向子类对象(这是多态),但,父类不能强制转换成子类,强制转换只有在基本类型中有用。但如果是这样:Base b = new Sub();   Sub s = (Sub)b;   这是可以的,即父类引用指向子类对象,可以再想使用子类属性时(成员变量)将其强制转换成子类类型——说白了,这也是多态。多态是java中很重要很重要的机制与原理,设计模式中也多基于此,要多加揣摩。希望能帮到你。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 很给力!

查看全部评分

回复 使用道具 举报
张洪慊 发表于 2013-12-30 23:46
Pencil pen=new Pencil();//父类引用指向父类对象(不是多态),你不能把父类的实例向下强转为子类!! ...

- -我 花了50分买光盘去了...........之后发现倒计时32天................
回复 使用道具 举报
可以在看看多态的实现机制:父类的引用变量可以指向子类的实例对象,而程序调用的方法在运行期间才动态绑定,就是引用变量所指向真正实例对象的方法,也就是内存中正在运行的那个对象的方法,而不是引用变量的类型里定义的方法
举个例子:
  1. public class Father {

  2.         public void  method1(){
  3.                 System.out.println("father-->method1");
  4.         }
  5.         public void method2(){
  6.                 System.out.println("father-->method2");
  7.         }
  8.         public void method3(){
  9.                 System.out.println("father-->method3");
  10.         }
  11. }
复制代码
  1. public class Son extends Father {

  2.         //从父类继承的方法
  3.         public void  method1(){
  4.                 System.out.println("son继承father-->method1");
  5.         }
  6.         public void method2(){
  7.                 System.out.println("son继承father-->method1");
  8.         }

  9.        
  10.         //子类特有的方法
  11.         public void method4(){
  12.                 System.out.println("son-->method3");
  13.         }
  14. }
复制代码
测试:
  1. public class TestDemo {

  2.         /**
  3.          * @param args
  4.          */
  5.         public static void main(String[] args) {
  6.                 Father f = new Son();
  7.                 /*编译的时候,父类虽然指向子类的实例对象,但是程序调用的方法在运行期间才动态绑定
  8.                  * 也是就是在编译阶段父类时不知道子类有什么方法的,父类的对象也知道调用父类里面的方法
  9.                  * 而无法调用子类的里面的方法,在运行的时候,父类对象调用的方法,如果子类继承并重写了父类的
  10.                  * 方法,就会调用子类覆写的方法,如果子类没有覆写父类方法,父类对象再调用的时候只会调用本身的方法
  11.                  * 为了调用子类特有的方法,必须将对象向下转型
  12.                  */
  13.                 f.method1();
  14.                 f.method2();
  15.                 f.method3();
  16.                 /*
  17.                  * method3是子类特有的方法,要想调用该方法,必须对象向下转型
  18.                  * */
  19.                 if(f instanceof Son){
  20.                         Son s = (Son)f;
  21.                         s.method4();
  22.                 }
  23.         }

  24. }
复制代码
测试结果:
son继承father-->method1
son继承father-->method1
father-->method3
son-->method3
对于对象多态,可以简单的使用  编译看左边、运行看右边
就是编译时调用的方法只能是左边对象里面的方法,运行的时候是调用右边对象里面覆写的方法,如果没有覆写就会继续调用左边对象的方法


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马