黑马程序员技术交流社区

标题: 重写构造方法有什么需要注意的吗? [打印本页]

作者: a631082744    时间: 2015-9-17 17:44
标题: 重写构造方法有什么需要注意的吗?
对这个有点不懂
作者: ximdefangzh    时间: 2015-9-20 10:02
子类拥有的成员变量包括自己的成员变量以及从父类继承而来的成员变量,在重写构造方法的时候应该首先对从父类继承而来的成员变量先进行初始化。

原则:先初始化父类的,再初始化子类的。

重写构造方法的目的:为了让对象方法一创建出来,成员变量就会有一些固定的值。

注意点:
先调用父类的构造方法[super init];
再进行子类内部成员变量的初始化。子类拥有的成员变量包括自己的成员变量以及从父类继承而来的成员变量,在重写构造方法的时候应该首先对从父类继承而来的成员变量先进行初始化。

原则:先初始化父类的,再初始化子类的。

重写构造方法的目的:为了让对象方法一创建出来,成员变量就会有一些固定的值。

注意点:
先调用父类的构造方法[super init];
再进行子类内部成员变量的初始化。
如果是自定义构造方法的话:方法名一般以initWith开头

作者: tianzuishiwo    时间: 2015-9-21 00:13
楼上说的,我也不懂,果然是菜鸟一枚,得更努力啊
作者: 摆摆    时间: 2015-9-21 10:01
同不懂= =
作者: 陆露    时间: 2015-9-21 11:12
构造方法是基本原则 首先要调用父类的 [super init]
为什么要这样做呢, 因为如果父类和子类拥有相同的方法,也就是子类重写init方法,那么程序就会先执行子类的方法 那么父类的方法就会被忽略 所以 当你子类在重写父类的方法时候 就必须把负累方法也赋值给子类对象为什么一定要带父类方法呢, 如果你明白你为什么要重写方法你就应该懂得了 你重写方法的目的是为了什么? 是为了初始化的时候也能同时定义变量的值 那么 父类init方法里如果也有同样给变量赋值 如果你在子类重写方法 不调用父类的方法 父类定义的变量值 不就没用了吗 这是我个人理解 所以老师强调又强调 super init是固定格式
好像继承也牵扯到一点关系吧 如果构造方法里不接收父类初始化后的地址 那子类初始化了之后 地址都是空的
这是我猜的不知道对不对。


- (id)initWithAge:(int)age
{

if (self = super init)//这里我认为就是 把super init 就是吧父类初始化的值赋值给当前子类
{
_age = age;
}
return self
}
作者: hejianchun    时间: 2015-9-21 13:14
- (id) init
{
if(self = [super init])
{ //为子类增加属性进行初始化
}
return self;
}
这里涉及了几个问题,
1. [super init]的作用: 面向对象的体现,先利用父类的init方法为子类实例的父类部分属性初始化。
2. self 为什么要赋值为[super init]: 简单来说是为了防止父类的初始化方法release掉了self指向的空间 并重新alloc了一块空 间(可能性很小)。这时的话,[super init]可能alloc失败,这时就不再执行if中的语 句。
3. super作为消息接受者的实质:
super并不是真正的指针,[super message]的实质是由self来接受父类的message。需要注 意的是,[super message]中,message方法出现的self为[super message]语境中的self, 即子类实例。
使用注意
(1)子类拥有的成员变量包括自己的成员变量以及从父类继承而来的成员变量,在重写构造方法的时候 应该首先对从父类继承而来的成员变量先进行初始化。
(2)原则:先初始化父类的,再初始化子类的。
(3)重写构造方法的目的:为了让对象方法一创建出来,成员变量就会有一些固定的值。
(4)注意点:
(1)先调用父类的构造方法[super init];
(2)再进行子类内部成员变量的初始化。





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