class A
{
public void print{("This is A");}
}class B extends A
{
public void print{("This is B");}
}class Main
{
public static void main(String[] args)
{
A a=new B();
B b=(B)a;
}
}在main方法中的代码,为什么不能写成以下的代码:
A a=new A();
B b=(B)a;为什么父类转换成子类,不能直接转换?为什么在父类转换成子类之前还要加上A a=new B()这句代码,让父类变量指向子类的对象引用呢?请各位朋友教教,谢谢啦!
A a = new B();
B b = (B)a;这种写法中变量a是A的对象,但是它实际指向的是B的对象,所以可以转型~~~~A a=new A();
B b=(B)a;这种情况下,变量a指向的是A的对象,Java中可以由子类转化为父类(不过会丢失信息),但是不可以由父类转化成子类。。会抛出java.lang.ClassCastException异常~~~~
B b=(B)a;这是错的,理解一下 父类的引用可以指向子类的对象
A a -> new A(); 可以
B b -> new B(); 可以
A a -> new B(); 可以
B b -> new A(); 不可以
A a或B b代表你用什么样的一个引用指向刚才new的对象.
可以用父类的引用,指向子类new的对象.这种情况下使用时,可以强制转换成子类的引用.强制转换时,只转换了引用,new B();还是那个new B();
告诉为什么要加强制转化,因为这样做本身就不安全。
加一句判断防止报错就好if (a instanceof B) {
B b = (B) a;
...
}
在方法分别使用两个子类自己重写了父类的方法。父类型变量指向子类对象,是可以将变量转换成子类的,这样才能使用子类特有的自己的方法,这是向下转型的意义。区别好对象和类型引用的关系。为什么父类转换成子类,不能直接转换?
先写个子类对象由父类型引用指向的代码给你看下。class Parent{
public void m1(){
System.out.println("父亲");
}
}
class Child1 extends Parent{
public void m1(){
System.out.println("儿子1");
}
}class Child2 extends Parent{
public void m1(){
System.out.println("儿子2");
}
public void m2(){
System.out.println("特有方法");
}
}public class T{
public void test(Parent t){
t.m1();//这里父类型变量可以指向接收不同子类,不同子类m1方法执行不同结果,实现多态
} public static void main(String args){
T classt = new T();
Parent c1 = new Child1();
Parent c2 = new Child2();
classt.test(c1);//这里输出儿子1,父类型变量指向Child1子对象,执行Child1重写的方法。
classt.test(c2);//这里输出儿子2,父类型变量指向Child2子对象,执行Child2重写的方法。
//那么为什么要让父类型变量指向子类对象后,还可以将变量类型转换回子对象类型的呢
//注意,这里向下转型是指转换回来,也就是说之前父类型变量指向某个子类后才能转换回来
//看见Child2里面的m2方法没有,这个方法父类没有,如果我想执行自己特有的方法,就可以通过向下转型
Child2 cc2 =(Child2)c2;
cc2.m2()//这里输出儿子特有方法,这就是向下转型的意义,它转回来了,能用自己特有方法
}}//父类转换成子类是指,父类型变量本来指向子类对象,现在需要将变量转换成就是子类对象类型的,
,而你说的子类转换成父类是没有任何意义的。难道是子类型变量指向父类对象,然后再转换父类型变量吗,
设计java的人觉得这样不好,并且也没有任何意义。所以不能这样。为什么在父类转换成子类之前还要加上A a=new B()这句代码,让父类变量指向子类的对象引用呢?
你要搞清楚,父类转换成子类,就是指,父类型变量之前转向子类对象去满足某种要求,具体要求见我上面代码,现在我要将这个类型转换回来,是回来!!回来才能用自己的特有方法,而不是说,父类型变量指向父类型对象,然后将父类型变量转换成子类型变量,这是错误的理解,没有任何意义!!!希望回答能让你满意,也能解决其他初学者的困惑。