8.属性和继承
2015-08-01 16:30
260 查看
1.main.m文件
//继承是单向的,一个类只能有一个父类,但是一个类可以有无数个子类,NSObject是所有类的父类.也可以成为基类 //C语言中如果针对一个空指针技能型操作,比如赋值,系统运行到这句代码系统就会崩溃,然而OC遇到空指针会把当成一句废代码,会执行,但是不会有任何结果 Person *person = [[Person alloc]init]; //对象通过设置器对成员变量内容进行修改 [person sname:@"张三"]; NSLog(@"%@",[person gname]);//--->张三 Student *student = [[Student alloc]init]; [student sname:@"yingwang"]; //继承:子类会继承父类所有的特征还有行为,类的继承具有传递性 //当对象在执行方法的时候,子类重写了父类的方法,系统会优先使用子类的方法,如果没有重写,则用父类的方法 [student eat];//--->Person eat [student sayHi];//-->Person sayHi //--> Student sayHi NSLog(@"%@",[student gname]);//--->yingwang //属性一共做了三件事 //1.声明了设置器setter和访问器getter //2.实现了设置器和访问器] //3.声明了一个成员变量,成员变量命名会在属性名的前面加一个下划线 //具体的数据存储,还是成员变量来完成,属性只是帮助程序员完成一些繁琐的工作,简化代码 //针对对象的属性,可以通过点语法来设置和获取里面的内容,大量节省了代码 //离=近的都是setter方法,其余都是getter方法 student.name = @"zhangxiaoyu"; NSLog(@"%@",student.name);//--->zhangxiaoyu //KVC:key - value - coding 键值编码 //把属性名看成kvc中的key,把要修改的值看成value,然后是通过KVC的方法,把值赋给指定的key [student setValue:@"崔某" forKey:@"name"]; NSLog(@"%@",student.name);//--->崔某 NSLog(@"%@",[student valueForKey:@"name"]);//--->崔某
2.Person.h和Person.m文件
#import <Foundation/Foundation.h> @interface Person : NSObject //1.读写控制:readonly(属性只有getter方法),readwrite(默认) //setter和getterd的作用是给设置器和访问器方法重新起一个名字,注意:设置器在名字的设置的时候不能缺省: @property(setter=sname:,getter=gname)NSString *name; //2.原子性控制:nonatomic,atomic //通过原子性atomic来监控事物在整个过程中有没有完成,但是一般来讲我们就是对数据的简单赋值,一般这部分我们用非原子性nonatomic //3.语义设置:copy(NSString),retain(对象类型和NSArray),assign(NSInteger,CGGloat等栈区) @property(nonatomic,copy,readonly)NSString *color; @property(nonatomic,assign)NSInteger age; - (void)sayHi; - (void)eat; //自定义初始化方法的声明 --->返回类型可以是(id)或则(Person *) - (instancetype)initWithName:(NSString *)name color:(NSString *)color age:(NSInteger)age; //便利构造器 --->返回类型可以是(id)或则(Person *) + (instancetype)personWithName:(NSString *)name color:(NSString *)color age:(NSInteger)age; @end
#import "Person.h" @implementation Person //关键词是@synthesize,前面放属性名,后面放成员变量 //@synthesize name = _name;在XCode 4.5之后可以不写 - (void)sayHi { NSLog(@"Person sayHi"); } - (void)eat { NSLog(@"Person eat"); } - (instancetype)initWithName:(NSString *)name color:(NSString *)color age:(NSInteger)age { //先调用一下父类的初始化方法,对父类继承过来的成员变量进行设置 self = [super init]; //当这个对象在初始化过程中出现问题,会返回一个空指针,如果是空指针接下来的赋值就没有意义,跳过去,如果返回是一个正常的对空间地址,才能继续赋值 if (self) { self.name = name; //self.color = color;--->属性为:readonly,不能进行赋值 _color = color;//---_color为成员变量可以赋值 //self.age = age;--->基本数据类型不需要你内存管理 _age = age; } return self; } + (instancetype)personWithName:(NSString *)name color:(NSString *)color age:(NSInteger)age { //便利构造器把创建对象的过程放到了程序的.m文件里,这样通过类,直接就能创建出一个对象出来 Person *person = [[Person alloc] initWithName:name color:color age:age]; return person; } @end
3.Student.h和Student.m文件
#import "Person.h" @interface Student : Person //子类只需要写自己特有的特征和方法就可以,其余的都会继承 @property(nonatomic,assign)CGFloat stuScore; - (instancetype)initWithName:(NSString *)name color:(NSString *)color age:(NSInteger)age stuScore:(CGFloat)stuScore; + (instancetype)studentWithName:(NSString *)name color:(NSString *)color age:(NSInteger)age stuScore:(CGFloat)stuScore; @end
#import "Student.h" @implementation Student //重写父类的方法,只需要在.m文件里写实现,不用声明,优先调用自己的方法 - (void)sayHi { //super就是寻找继承过来的方法,并且执行该方法 [super sayHi]; NSLog(@"Student sayHi"); } - (instancetype)initWithName:(NSString *)name color:(NSString *)color age:(NSInteger)age stuScore:(CGFloat)stuScore { self = [super initWithName:name color:color age:age]; if (self) { _stuScore = stuScore; } return self; } + (instancetype)studentWithName:(NSString *)name color:(NSString *)color age:(NSInteger)age stuScore:(CGFloat)stuScore { Student *student = [[Student alloc] initWithName:name color:color age:age stuScore:stuScore]; return student; } @end
相关文章推荐
- [Objective-C] 014_Objective-C 代码规范指南
- 34款Firefox渗透测试插件
- http各种状态码详解
- DesignPattern之Command
- 看病要排队
- 两种生成全排列序列的方法
- 深入理解Java:内省(Introspector)
- 关于mschart在显示百分比时需要注意的情况
- 黑马程序员——多线程2
- android开发常用基础操作
- 解压.tar.bz2文件
- boa服务器移植
- Best Time to Buy and Sell Stock
- MySQL中基本的用户和权限管理方法小结
- CSS 整理(3)
- Web service是什么?
- MATLAB 求图像的极大值极小值,平均值
- CImageList
- SQL生成随机字符串
- 利用websocket实现安卓消息推送