父对象与子对象的转换,请懂java的指导一下
本帖最后由 bigcan 于 2021-3-11 15:43 编辑本人常用的是C#,这里看不明白java的语法
在学习的时候看到java的转换,方法中这里RBNode是Node的子类,color 是RBNode子类的对象属性,这样转换,最后返回的是类又是Node,但是Node没有color属性的,这样是不是等于没操作啊?
C#肯定是编译不通过的,java看样子是能通过,而且返回的node变成了子类对象,这个是什么原理啊
查到原因,是java的特性,在思想上确实与C#有着极大的差异
https://segmentfault.com/q/1010000004847075
强制类型转换,向下转型,没有的属性,初始化为默认值 Java的多态性,父类引用接收子类对象 LeagueJinx 发表于 2021-3-11 15:32
强制类型转换,向下转型,没有的属性,初始化为默认值
哪方法返回的是Node,Node根本就没有color属性,按我理解,这只能是个空操作,但实际看视频,返回的却是RBNode
在C#,Node必须声明为抽象类,才能这样,但看java代码,就是一个普通类,好晕 对于引用类型到引用类型的强制类型转换,最终结果仅仅是显示上的区别无误,底下实际对象的状态不需要被改变。
关键点在于引用跟对象是两个独立的概念。引用可以指向对象,对象可以包含引用类型的字段进一步指向别的对象。强制转换的只是引用而不是对象。 我也是用C#的,可以这样做啊,Node是父类,RBNode是子类,父类可以接收子类,但不意味着Node接收后内存里的RBNode就不是子类RBNode了,只是看不到子类的成员而已,另外不是父类就必须声明抽象
class BaseNode
{ }
class RBNode : BaseNode
{
public Color mColor;
}
private BaseNode MakeNode(BaseNode node, Color color)
{
((RBNode)node).mColor = color;
return node;
}
privatevoid button1_Click(object sender, EventArgs e)
{
RBNode node = new RBNode();
var item = MakeNode(node, Color.Red);
this.button1.BackColor = ((RBNode)item).mColor;
} 可以想想关于Object类的转换 陈腔滥调的K 发表于 2021-3-11 15:43
我也是用C#的,可以这样做啊,Node是父类,RBNode是子类,父类可以接收子类,但不意味着Node接收后内存里的 ...
好的,谢谢,明白了
页:
[1]