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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 潘天功 中级黑马   /  2012-11-23 20:03  /  1402 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 潘天功 于 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)

评分

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

查看全部评分

3 个回复

倒序浏览

回帖奖励 +1 黑马币

异常ClassCastException 表示发生了类型转化异常
B b = (B)a;  此句并不是向下转型关系, a引用指向的是父类对象,相当于强制将cat转成dog
A a = new A();这不是多态, A a = new B();这个才是多态,父类引用指向子类对象。这时B b = (B)a才是向下转型。

评分

参与人数 1技术分 +1 收起 理由
崔政 + 1 赞一个!

查看全部评分

回复 使用道具 举报

回帖奖励 +1 黑马币

顶楼上的兄弟,正解!
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修饰?
回复 使用道具 举报

回帖奖励 +1 黑马币

我认为是这样的:

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

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

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

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

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

评分

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

查看全部评分

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