关于对象转换问提,多态也在这里

时间:2021-10-19 16:17:46
对象的转换,我有三个类
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确只能从子类转换到父类,不能从父类转换成子类,为什么会这样;

对象转换过程中的转换倒底是啥子意思,遵循什么样的规循;

10 个解决方案

#1


D   d   =   (D)   new   ArrayList().get();
这句话 不要NEW 的 new 是用来声明 和创建的

#2


A   a   =   (A)new   B();     -----OK; 
这个不需要转换,直接用A   a   =   new   B(); 举一个常用的例子:Map map = new HashMap();

要将子类对象指向父类对象是需要强制转换如 B b = (B)a;

转化的规则就是面向对象的基本概念,必须要有is-a的关系才行

#3


B extends A
C extends A
B b = (B) new A();
这句话本身就是错的
因为只有现有父亲后来才能有儿子
只有当
A a = nwe C();
的时候才能 C c = (C)a

#4


你可以这样理解,子类里面包含一个父类,当你用父类的引用指向一个子类的对象时其实是指向了子类中父类的那一部分。
子类可以转换为父类也是这个道理,至于父类对象不能转换为子类对象是因为父类没有子类拓展出来的那一部分。

#5


D       d       =       (D)       new       ArrayList().get(); 
这句话   不要NEW   的   new   是用来声明   和创建的

这个new 主要是用来创建一个对象,因为没有对象就不能调用其get()方法;

#6


A       a       =       (A)new       B();           -----OK;   
这个不需要转换,直接用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也可以通过,想请你继续解释

#7


B b = a -----这是将父对象转成子对象,因为子对象继承了父对象的所有属性,所以这种转化是不需要强转的
A a = (A)b---这个时候则会造成子对象自己的属性的丢失,所以需要强转。

对于Map map = new HashMap();首先Map是借口不是类,而继承和接口实现从某种意义上是相反的,具体的面向对象
的书上都有讲。

可能说得不是很清楚,呵呵

#8


刚刚试了一下原来我一直理解反了,不好意思。
B b  = (B)a;其实是将b的引用指向a对象的一个过程,如果b的属性比a多,那么
引用就无法正确指向,这时候需要强转。
不知道理解的对不对,欢迎指正。感谢大家让我认识了一个一直没注意得错误。

#9


强制转换转换是有风险的,如果b的属性比a多,
且引用a所指向的对象是A类型的,那么如你这么转换: 
B b = (B)a;
当引用变量b访问的属性是a没有的,将会出现一个RuntimeException.

#10


刚刚试了一下原来我一直理解反了,不好意思。 
B   b     =   (B)a;其实是将b的引用指向a对象的一个过程,如果b的属性比a多,那么 
引用就无法正确指向,这时候需要强转。 
不知道理解的对不对,欢迎指正。感谢大家让我认识了一个一直没注意得错误。

回8楼,如果b属性比a多,是不能强转的,因为b里面存放的有a不存在的指向,所以如果你这样强转的话,b中比a多的引用就没有指向了,显然不行,

#1


D   d   =   (D)   new   ArrayList().get();
这句话 不要NEW 的 new 是用来声明 和创建的

#2


A   a   =   (A)new   B();     -----OK; 
这个不需要转换,直接用A   a   =   new   B(); 举一个常用的例子:Map map = new HashMap();

要将子类对象指向父类对象是需要强制转换如 B b = (B)a;

转化的规则就是面向对象的基本概念,必须要有is-a的关系才行

#3


B extends A
C extends A
B b = (B) new A();
这句话本身就是错的
因为只有现有父亲后来才能有儿子
只有当
A a = nwe C();
的时候才能 C c = (C)a

#4


你可以这样理解,子类里面包含一个父类,当你用父类的引用指向一个子类的对象时其实是指向了子类中父类的那一部分。
子类可以转换为父类也是这个道理,至于父类对象不能转换为子类对象是因为父类没有子类拓展出来的那一部分。

#5


D       d       =       (D)       new       ArrayList().get(); 
这句话   不要NEW   的   new   是用来声明   和创建的

这个new 主要是用来创建一个对象,因为没有对象就不能调用其get()方法;

#6


A       a       =       (A)new       B();           -----OK;   
这个不需要转换,直接用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也可以通过,想请你继续解释

#7


B b = a -----这是将父对象转成子对象,因为子对象继承了父对象的所有属性,所以这种转化是不需要强转的
A a = (A)b---这个时候则会造成子对象自己的属性的丢失,所以需要强转。

对于Map map = new HashMap();首先Map是借口不是类,而继承和接口实现从某种意义上是相反的,具体的面向对象
的书上都有讲。

可能说得不是很清楚,呵呵

#8


刚刚试了一下原来我一直理解反了,不好意思。
B b  = (B)a;其实是将b的引用指向a对象的一个过程,如果b的属性比a多,那么
引用就无法正确指向,这时候需要强转。
不知道理解的对不对,欢迎指正。感谢大家让我认识了一个一直没注意得错误。

#9


强制转换转换是有风险的,如果b的属性比a多,
且引用a所指向的对象是A类型的,那么如你这么转换: 
B b = (B)a;
当引用变量b访问的属性是a没有的,将会出现一个RuntimeException.

#10


刚刚试了一下原来我一直理解反了,不好意思。 
B   b     =   (B)a;其实是将b的引用指向a对象的一个过程,如果b的属性比a多,那么 
引用就无法正确指向,这时候需要强转。 
不知道理解的对不对,欢迎指正。感谢大家让我认识了一个一直没注意得错误。

回8楼,如果b属性比a多,是不能强转的,因为b里面存放的有a不存在的指向,所以如果你这样强转的话,b中比a多的引用就没有指向了,显然不行,