黑马程序员技术交流社区

标题: 为什么会出现程序运行时错误 [打印本页]

作者: 潘天功    时间: 2012-11-23 20:03
标题: 为什么会出现程序运行时错误
本帖最后由 潘天功 于 2012-11-23 21:49 编辑

class A                                                                            //定义类A
{
public void fun1(){                                                         //定义fun1()方法
       System.out.println("A-->public void fun1()");                  
          }
public void fun2(){                                                         //定义fun2()方法
    this.fun1();
         }
}
class B extend A{                                                          //子类通过extends继承父类
    public void fun1(){
      System.out.println("B-->public void fun1(){}");         //覆写父类中的fun1()方法
         }
public void fun3(){
      System.out.println("B-->public void fun3(){}");        //子类自己定义的方法
         }
}
public class PolDemo03
{
public static void main(String[] args){
    A a = new A();               //此时声明的是父类对象   
    B b = (B)a;                    //此时发生了向下转型关系
    b.fun1();                       //调用被覆写的方法  
    b.fun2();                       //调用父类的方法  
    b.fun3();                      //调用子类自己定义的方法   
               }
}
为什么程序运行时会出现如下错误:
Exception in thread"main"java.lang.ClassCastException: A
at polDemo03.main(PolDemo03.java:21)


作者: 郑世光    时间: 2012-11-23 20:14
异常ClassCastException 表示发生了类型转化异常
B b = (B)a;  此句并不是向下转型关系, a引用指向的是父类对象,相当于强制将cat转成dog
A a = new A();这不是多态, A a = new B();这个才是多态,父类引用指向子类对象。这时B b = (B)a才是向下转型。
作者: filter    时间: 2012-11-23 20:36
顶楼上的兄弟,正解!
class A                                                                            //定义类A
{
public void fun1(){                                                         //定义fun1()方法
       System.out.println("A-->public void fun1()");                  
          }
public void fun2(){                                                         //定义fun2()方法
    this.fun1();
         }
}
class B extends A {                                                          //子类通过extends继承父类
    public void fun1(){
      System.out.println("B-->public void fun1(){}");         //覆写父类中的fun1()方法
         }
public void fun3(){
      System.out.println("B-->public void fun3(){}");        //子类自己定义的方法
         }
}
class PolDemo03
{
public static void main(String[] args){
    A a = new B();               //此时声明的是父类对象   
    B b = (B)a;                    //此时发生了向下转型关系
    b.fun1();                       //调用被覆写的方法  
    b.fun2();                       //调用父类的方法  
    b.fun3();                      //调用子类自己定义的方法   
               }
}
修改之后输出运行结果
B-->public void fun1(){}
B-->public void fun1(){}
B-->public void fun3(){}
但是我不明白的是,楼主的代码中public class PolDemo03,出现了公共类,编译时会报错Demo.java:18: 错误: 类PolDemo03是公共的, 应在名为 PolDemo03.java 的文件中声明
虽然去掉public修饰词,可以通过编译,可是我不太明白为什么,为什么不能加public修饰?
作者: 杨卫腾    时间: 2012-11-23 21:02
我认为是这样的:

这里发生了异常ClassCastException  表示发生了类型转化异常;

B b = (B)a;  此句表示的是向下转型, 子类的引用指向父类对象;
就是强转类型,相当于强制将cat c = (cat) new Animal();

什么是多态,一句话,多态就是:父类的引用指向子类对象;

比如,A a = new B() ;这是多态,父类引用指向子类对象。编译器是通过的,但是运行的时候会报错的,再说a中没有 fun3()方法。

在向下转型的时候,我们一般都是要用 instanceof 进行判断,向上转型常见,向下不常见的。





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