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()方法。