黑马程序员技术交流社区

标题: super关键字的使用,相当迷惑 [打印本页]

作者: D调的沉默    时间: 2014-5-6 07:40
标题: super关键字的使用,相当迷惑
本帖最后由 D调的沉默 于 2014-5-6 22:22 编辑

super关键字在继承中子类对象方法是指向父类对象吗?如果是指向父类对象,可是我只创建了子类对象啊?难道是创建了一个子类,就会同时自动创建个父类对象?

   如果我是n层继承关系,那就是说我创建了个最底层的子类对象,那么系统会自动创建好n-1个父类对象?求解答?
作者: zfan    时间: 2014-5-6 08:20
本帖最后由 zfan 于 2014-5-7 05:13 编辑

当创建了一个子类对象时,该对象内部包含了一个父类的"子对象",这个被包含的父类"子对象"和你用父类直接创建出的对象是一样的。唯一区别是,父类的"子对象"被包装在子类对象的内部。这种创建是向外扩散的,先建立最根部的父类"子对象",然后一层一层向外建立并返回子类对象。就好像俄罗斯套娃的结构,先建立最里面的的人偶,然后层层向外包裹返回,每包裹一层就加上一层子类的属性和方法(包括重写父类的方法),最终返回一个完整的子类对象。这也是我理解的self=[super init]的实质。                                              PS:看到楼下的质疑了,回去又查了查资料,确实没有生成父类对象,我的理解有误,抱歉,看来自己还是要加强学习啊
作者: 葬花桥    时间: 2014-5-6 08:23
本帖最后由 葬花桥 于 2014-5-6 08:30 编辑

不是这样的吧,super只是让子类可以调用父类方法,而且对象与对象之间是独立的,除非super指向了对象,但是父类没有创建对象,你想,要是父类也创建对象,那NSObject也要创建对象,事实上它是不能创建的!所以super应该是指向了父类,而不是它的对象,,可以让子类直接调用父类方法
作者: 桑托尔    时间: 2014-5-6 09:09
不需要,super直接调用父类中的方法,无需父类创建对象,拿init方法给你举例

super实际上通过子类的对象,指向子类本身,而后又指向了父类对象,最终指向NSObject。不用每一层级都创建出自己的对象。
上图摘自教学视频
\黑马程序员_iOS开发零基础入门教程\黑马程序员_IOS开发零基础教程-04Objective-C\02-面向对象\05-核心语法\构造方法
你可以从新看下
作者: m573555543    时间: 2014-5-6 09:23
桑托尔 发表于 2014-5-6 09:09
不需要,super直接调用父类中的方法,无需父类创建对象,拿init方法给你举例

super实际上通过子类的对象, ...

图片看不了
作者: 桑托尔    时间: 2014-5-6 09:25
m573555543 发表于 2014-5-6 09:23
图片看不了

\黑马程序员_iOS开发零基础入门教程\黑马程序员_IOS开发零基础教程-04Objective-C\02-面向对象\05-核心语法\构造方法04 -init方法执行过程.mp4
8分54秒,可以参考下这个图

作者: wyduli    时间: 2014-5-6 09:33
结合initialize来分析会比较好处理些
作者: D调的沉默    时间: 2014-5-6 22:21
葬花桥 发表于 2014-5-6 08:23
不是这样的吧,super只是让子类可以调用父类方法,而且对象与对象之间是独立的,除非super指向了对象,但是 ...

恩确实不会创建父类对象,2楼就是扯淡,super也不是指向了父类对象,而是一个指示器作用,指示去调用父类的方法。
作者: D调的沉默    时间: 2014-5-6 22:22
桑托尔 发表于 2014-5-6 09:09
不需要,super直接调用父类中的方法,无需父类创建对象,拿init方法给你举例

super实际上通过子类的对象, ...

你这个理解好像不对哦。因为创建子类对象压根就没有父类对象的,所以没有指向了父类对象,再指向NSobject对象
作者: 桑托尔    时间: 2014-5-7 09:18
D调的沉默 发表于 2014-5-6 22:22
你这个理解好像不对哦。因为创建子类对象压根就没有父类对象的,所以没有指向了父类对象,再指向NSobject ...

我错了 口误 压根父类不需要创建对象




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2