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()这句代码,让父类变量指向子类的对象引用呢?请各位朋友教教,谢谢啦!

解决方案 »

  1.   

    A a; 这是定义一个类型为 A 的引用B b; 这是定义一个类型为 B 的引用new A(); 这是一个类型为 A 的对象new B(); 这是一个类型为 B 的对象父类的引用可以指向子类的对象但是子类的引用不可以指向父类的对象
      

  2.   


    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异常~~~~
      

  3.   

    父类的引用可以指向子类的对象 :A a=new B();
    B b=(B)a;这是错的,理解一下 父类的引用可以指向子类的对象
      

  4.   

    即 
    A a -> new A(); 可以
    B b -> new B(); 可以
    A a -> new B(); 可以
    B b -> new A(); 不可以
      

  5.   

    new A(); new B(); 用其中一个代表实际运行过程中,实例化的是一个什么样的对象.
    A a或B b代表你用什么样的一个引用指向刚才new的对象.
    可以用父类的引用,指向子类new的对象.这种情况下使用时,可以强制转换成子类的引用.强制转换时,只转换了引用,new B();还是那个new B();
      

  6.   

    好好看看java中的上溯和下溯。
    告诉为什么要加强制转化,因为这样做本身就不安全。
      

  7.   

    去看看java编程思想的上下转型
      

  8.   

    我到觉得没什么不安全的
    加一句判断防止报错就好if (a instanceof B) {
        B b = (B) a;
        ...
    }
      

  9.   

    父类型的引用指向子类对象是为了实现多态。比如  test(Parent arg)  参数为父类Parent类型的 ,现有子类Child1, Child2 分别继承父类Parent,你可以根据需要分别传递Child1  或Child2,test(Child1)或test(Child2)
    在方法分别使用两个子类自己重写了父类的方法。父类型变量指向子类对象,是可以将变量转换成子类的,这样才能使用子类特有的自己的方法,这是向下转型的意义。区别好对象和类型引用的关系。为什么父类转换成子类,不能直接转换?
    先写个子类对象由父类型引用指向的代码给你看下。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()这句代码,让父类变量指向子类的对象引用呢?
    你要搞清楚,父类转换成子类,就是指,父类型变量之前转向子类对象去满足某种要求,具体要求见我上面代码,现在我要将这个类型转换回来,是回来!!回来才能用自己的特有方法,而不是说,父类型变量指向父类型对象,然后将父类型变量转换成子类型变量,这是错误的理解,没有任何意义!!!希望回答能让你满意,也能解决其他初学者的困惑。