bigcan 发表于 2021-3-11 15:21

父对象与子对象的转换,请懂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

LeagueJinx 发表于 2021-3-11 15:32

强制类型转换,向下转型,没有的属性,初始化为默认值

SpeII 发表于 2021-3-11 15:34

Java的多态性,父类引用接收子类对象

bigcan 发表于 2021-3-11 15:36

LeagueJinx 发表于 2021-3-11 15:32
强制类型转换,向下转型,没有的属性,初始化为默认值

哪方法返回的是Node,Node根本就没有color属性,按我理解,这只能是个空操作,但实际看视频,返回的却是RBNode

在C#,Node必须声明为抽象类,才能这样,但看java代码,就是一个普通类,好晕

LeagueJinx 发表于 2021-3-11 15:43

对于引用类型到引用类型的强制类型转换,最终结果仅仅是显示上的区别无误,底下实际对象的状态不需要被改变。
关键点在于引用跟对象是两个独立的概念。引用可以指向对象,对象可以包含引用类型的字段进一步指向别的对象。强制转换的只是引用而不是对象。

陈腔滥调的K 发表于 2021-3-11 15:43

我也是用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;
      }

LeagueJinx 发表于 2021-3-11 15:44

可以想想关于Object类的转换

bigcan 发表于 2021-3-11 15:45

陈腔滥调的K 发表于 2021-3-11 15:43
我也是用C#的,可以这样做啊,Node是父类,RBNode是子类,父类可以接收子类,但不意味着Node接收后内存里的 ...

好的,谢谢,明白了
页: [1]
查看完整版本: 父对象与子对象的转换,请懂java的指导一下