class A{
int a = 1;
public int getA(){
return a;
}
}
class B extends A{
int a = 2;
public int getA(){
return a;
}
}
public class li{
public static void main ( String [] args) {
B a11 = (B)new A();
}
}
编译没有问题,运行时为什么会有异常呢?
Exception in thread "main" java.lang.ClassCastException:怎么修正才行?
你这样,把父类A看成double型
把子类B看成 int型把int转成double当然可以了,前面补0就可以了。
但把double转成int就不行啊
int a = 1;
public int getA(){
return a;
}
}
class B extends A{
int a = 2;
public int getA(){
return a;
}
}
public class li{
public static void main ( String [] args) {
A a11 = new B();
}
}
父类不能转子类才差不多;不要误导楼主
因为父类对象在创建的时候分配的空间是父类的,而子类可能需要的更多(比如子类多几个属性);
这样在把父类转子类的时候,因为父类没有足够的空间,故报错;
谁说有子类转父类的时候报错的啊
class A{}
class B extends A{}
A b = new B();
这都不用转,自动向上转型的;子类多的空间父类引用不出来这叫擦除。
B b1 = (B)b; //这又叫恢复;
注意 只有对象是子类,引用是父类的时候,因为需要引用某些子类的属性的时候,才会把这个转成子类的,
外表看起来是 父类转子类,其实只是把引用转回来,如果对象是父类的话是不可能转成子类的
//向下转型有误
class A{
int a = 1;
public int getA(){
return a;
}
}
class B extends A{
int a = 2;
public int getA(){
return a;
}
}
public class li{
public static void main ( String [] args) {
A a11=new B();
}
}
code=Java]public static void main ( String [] args) {
A a = new B();
B a11 =(B) a;
}[/code]
这样转型才不会出问题!
A a = new B();
B a11 =(B) a;
}
这样转型才不会出问题,a的引用类型转成实际类型不会有问题。
B a11 = (B)new A();
说的更具体点,错误在转型父类对象到子类的代码
(B)new A()
B类继承A类,所以B类实例可以被归属为A类实例,但是A类实例不可以被归属为B类实例。
也就是说A a11=new B()是正确的,B a11 = (B)new A()会有转型错误。不过我想lz的意思并不是A a11=new B(),lz想做的应该是
A a2 = new B();
B a11 = (B)a2
这是在多态中比较常见的用法,a2虽然是A类的变量,不过a2实际引用的可能是A类或是任何A类的子类的对象。但是编译器只通过变量声明来判断类型,所以上述代码需要通过(B)告知编译器a2引用的对象其实是B类。但如果在运行时实际对象并不属于B类,就会抛出ClassCastException。再回到lz的代码(B)new A(),因为在运行时实际拥有的是A类的对象,而A类的对象并不属于B类,所以抛出ClassCastException不知道用没有解释清楚,见笑了