对象的转换,我有三个类
A,B,C
B extends A
c extends A可以把B转换成A A a = (A)new B(); -----OK;
可以把C转换成A A a1 = (A)NEW c(); -----ok;但是我用一个ArrayList 里面装两个类D对象d1,d2;
现我取出时返回值为Object为啥必需这样才能访问 D d = (D) new ArrayList().get();这样访问,这样是实现了从Object(父类)强转到子类,而上面的B,C确只能从子类转换到父类,不能从父类转换成子类,为什么会这样;对象转换过程中的转换倒底是啥子意思,遵循什么样的规循;
A,B,C
B extends A
c extends A可以把B转换成A A a = (A)new B(); -----OK;
可以把C转换成A A a1 = (A)NEW c(); -----ok;但是我用一个ArrayList 里面装两个类D对象d1,d2;
现我取出时返回值为Object为啥必需这样才能访问 D d = (D) new ArrayList().get();这样访问,这样是实现了从Object(父类)强转到子类,而上面的B,C确只能从子类转换到父类,不能从父类转换成子类,为什么会这样;对象转换过程中的转换倒底是啥子意思,遵循什么样的规循;
这句话 不要NEW 的 new 是用来声明 和创建的
这个不需要转换,直接用A a = new B(); 举一个常用的例子:Map map = new HashMap();要将子类对象指向父类对象是需要强制转换如 B b = (B)a;转化的规则就是面向对象的基本概念,必须要有is-a的关系才行
C extends A
B b = (B) new A();
这句话本身就是错的
因为只有现有父亲后来才能有儿子
只有当
A a = nwe C();
的时候才能 C c = (C)a
这句话 不要NEW 的 new 是用来声明 和创建的这个new 主要是用来创建一个对象,因为没有对象就不能调用其get()方法;
这个不需要转换,直接用A a = new B(); 举一个常用的例子:Map map = new HashMap(); 要将子类对象指向父类对象是需要强制转换如 B b = (B)a; 转化的规则就是面向对象的基本概念,必须要有is-a的关系才行
回2楼,你回答得很好,让我理解得深入了一点,从内存上来说,确实如你所说的,如果 A a = (A)new B(); -----OK; 这样,是直势接把创建的内象空间直接指向了a,因为B里面有a的构造,所以可以直接赋给a,非常感谢,但是从编译和测试来看,你所说的B b = (B)a,也不用强转,直接B b = a也可以通过,想请你继续解释
A a = (A)b---这个时候则会造成子对象自己的属性的丢失,所以需要强转。对于Map map = new HashMap();首先Map是借口不是类,而继承和接口实现从某种意义上是相反的,具体的面向对象
的书上都有讲。可能说得不是很清楚,呵呵
B b = (B)a;其实是将b的引用指向a对象的一个过程,如果b的属性比a多,那么
引用就无法正确指向,这时候需要强转。
不知道理解的对不对,欢迎指正。感谢大家让我认识了一个一直没注意得错误。
且引用a所指向的对象是A类型的,那么如你这么转换:
B b = (B)a;
当引用变量b访问的属性是a没有的,将会出现一个RuntimeException.
B b = (B)a;其实是将b的引用指向a对象的一个过程,如果b的属性比a多,那么
引用就无法正确指向,这时候需要强转。
不知道理解的对不对,欢迎指正。感谢大家让我认识了一个一直没注意得错误。回8楼,如果b属性比a多,是不能强转的,因为b里面存放的有a不存在的指向,所以如果你这样强转的话,b中比a多的引用就没有指向了,显然不行,