Person.m
#import "Person.h"
@implementation
//重写-init方法
- (id)init
{
//1.一定要调用回super的init方法:初始化父类中声明的一些成员变量和其他属性
self = [super init];//当前对象 self
//2,如果对象初始化成功,才有必要进行接下来的初始化
if (self != nil)
{//初始化成功
_age = 10;
}
//3,返回一个已经初始化完毕的对象
return self;
}
//简写版
- (id)init
{
if ( self == [super init])
{
_age = 10;
}
return self;
}
@end
Student.m
#import "Student.h"
- (id)init
{
if( self = [super alloc])//不要追究self后面的等号,固定写法
{
//_age = 10这句话是不必要而且错的,super父类-init里面有,就不用再赋值,而且因为_age是私有的,超过了成员变量的作用域
_no = 1;
}
return self;
}
main.m
#import "Person.h"
//构造方法 :用来初始化对象的方法,是个对象方法,-开头
//重写构造方法的目的:为了让对象创建出来,成员变量有个固定值
/*
重写构造方法的注意点
1.先调用父类的构造方法[super init]
2在进行子类内部变量的初始化。
*/
int main()
{
Person *p = [Person new];
/*new方法内部调用两个方法:完整创建一个可用对象
1,分配存储空间 + alloc方法
2,初始化 -init方法
*/
//1.调用+alloc分配存储空间
Person *p1 = [Person alloc];//Return a new instance of the receiving class.
//2,调用-init进行初始化
Person *p2 = [p1 init];
//整合,以后不要写new,写init
Person *p3 = [[Person alloc] init];
p3.age = 10;//每次保证创建出的对象成员变量为10
//每个Person对象创建出来,他的_age是10.
Person *p4 = [[Person alloc] init];
Student *stu =[[Student alloc] init];
NSLog(@"----");
return 0;
}
三个构造方法
Student
-(id)init
{
if(self = [super init])
{
_no = 1;
}
return self;
}
Person
-(id)init
{
if(self = [super init])
{
_age = 10;
}
return self;
}
NSObject
-(id)init
{
isa = [self class];
return self;
}
自定义构造方法
@interface Person : NSObject
@property NSString *_name;
@property int _age;
/*自定义构造方法的规范
1.一定是对象方法,以-号开头
2.返回值一般是id类型
3,方法名一般以initWith开头
*/
- (id)initWithName:(NSString *)name;
- (id)initWithName:(NSString *)name andAge:(int)age;
@end
@implementation Person
- (id)initWithName:(NSString *)name
{
if ( self = [super init])
{
_name = name;
}
return self;
}
- (id)initWithAge:(int)age
{
if(self = [super init])
{
_age = age;
}
}
- (id)initWithName:(NSString *)name andAge:(int)age
{
if (self = [super init])
{
_name = name;
_age = age;
}
return self;
}
@end
int main()
{
Person *p = [[Person alloc] initWithName:@"Rose"];
//等价于Person *p = [[Person alloc] init];p.name =@"Rose";
Person *p2 = [[Person alloc] initWithAge:20];
Person *p3 = [[Person alloc] initWithName:@"jack" andAge:27];
}
#import "Person.h"
@interface Student : Person
@property int no;
- (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no;
@end
@implementation Student
//父类的属性交给父类方法去处理,子类的方法处理子类自己的属性
- (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no
{
/*将name,age传递到父类方法中进行初始化。自己管自己的no就行了
好处:一旦父类改动name父类成员变量的名字,不会对这种方法产生影响,因为它对父类的成员变量已经交由父类自己处理。
*/
if ( self = [super initWithName:name andAge:age])
//注意name,age前面无类型。
{
_no = no;
}
/*if (self = [super init])
{
_no = no;
self.name = name;
self.age = age;
//_name = name;父类变量私有不能在这里写
//[self setName:name];首先调用本类里面的setName没有,再找super的。
//[self setAge:age];
}*/
return self;
}
@end
int main()
{
Student *s = [[Student alloc] initWithName:@"jim" andAge:23 andNo:3];
}
---------------------- ASP.Net+Unity开发、 .Net培训、期待与您交流! ----------------------详细请查看: www.itheima.com