黑马程序员技术交流社区

标题: 类型转换异常???? [打印本页]

作者: Zenith    时间: 2013-12-30 23:29
标题: 类型转换异常????
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:

作者: Zenith    时间: 2013-12-30 23:31
这里怎么发生的异常阿?    Fu f = new  Zi();   是向上转型 , 那 向下转型 不是也可以的吗 ?不明白  ,求解   谢谢了
作者: 张洪慊    时间: 2013-12-30 23:46
Pencil pen=new Pencil();//父类引用指向父类对象(不是多态),你不能把父类的实例向下强转为子类!!
作者: jibenwujie    时间: 2013-12-31 00:00
语法没有错误,所以编译不会报错。但是,b作为父类的引用,可以指向子类对象(这是多态),但,父类不能强制转换成子类,强制转换只有在基本类型中有用。但如果是这样:Base b = new Sub();   Sub s = (Sub)b;   这是可以的,即父类引用指向子类对象,可以再想使用子类属性时(成员变量)将其强制转换成子类类型——说白了,这也是多态。多态是java中很重要很重要的机制与原理,设计模式中也多基于此,要多加揣摩。希望能帮到你。
作者: 张洪慊    时间: 2013-12-31 08:20
张洪慊 发表于 2013-12-30 23:46
Pencil pen=new Pencil();//父类引用指向父类对象(不是多态),你不能把父类的实例向下强转为子类!! ...

- -我 花了50分买光盘去了...........之后发现倒计时32天................
作者: tuanjie    时间: 2013-12-31 10:33
可以在看看多态的实现机制:父类的引用变量可以指向子类的实例对象,而程序调用的方法在运行期间才动态绑定,就是引用变量所指向真正实例对象的方法,也就是内存中正在运行的那个对象的方法,而不是引用变量的类型里定义的方法
举个例子:
  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
对于对象多态,可以简单的使用  编译看左边、运行看右边
就是编译时调用的方法只能是左边对象里面的方法,运行的时候是调用右边对象里面覆写的方法,如果没有覆写就会继续调用左边对象的方法







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2