面向对象的特征:
1)封装 2)继承 3)多态
知识点:
(1)set/get方法(成员变量的封装)
(2)构造方法
(3)self的使用
(4)对象方法和类方法
小知识点补充
(一)set/get方法
【set】:用形参给成员变量赋值
【get】:返回成员变量的值
代码示例
#import <Foundation/Foundation.h> // 声明 @interface Car : NSObject { //@public // 以后的成员变量最好不要写@public, // 因为@public修饰的成员变量可以被别人乱改 int _wheels; // 轮子个数 // 成员变量的命名规范 // 成员变量都以下划线 _ 开头 // 1.可以跟get方法的名称区分开 // 2.一看到下划线开头的变量,肯定是成员变量 /* set方法 1.作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值 2.命名规范: 1> 方法都是以set开头,而且后面跟上成员变量名,成员变量名的首字母必须大写 2> 形参名称不要跟成员变量同名 3.因为只是提供方法设置值,所以,返回值为void */ - (void) setWheels:(int)newWheels; /* get方法 1.作用:返回对象内部的成员变量 2.命名规范: 1> get方法的名称一般就跟成员变量同名 3.因为get方法是要取得成员变量的值,所以返回值类型,和成员变量类型相同 */ - (int) wheels; // 跑 - (void) run; @end @implementation Car // 跑的实现 - (void) run { NSLog(@"%i个轮子的车跑起来了!", wheels); } // set方法的实现 - (void) setWheels:(int)newWheels { // 对外面传进来的轮子数进行过滤(当我们需要过滤数据时) if (newWheels<=0) { newWheels = 1; } _wheels = newWheels; // 一般就写这一句就行了 } // get方法的实现 - (int) wheels { return _wheels; } @end int main() { Car *car = [Car new]; // car->wheels = -10; 当@public时,才能使用此方法直接设置值 // 通过set方法设置Car对象的_wheels成员变量 [car setWheels:-100]; [car run]; // [car wheels]通过get方法获得Car对象的_wheels成员变量 NSLog(@"轮子个数:%i", [car wheels]); return 0; }
补充
// 多个 -(void)setAge:(int)a AndWeight:(int)w AndHeight:(int)h { //方法一:直接给成员变量赋值 // _age = a; // _weight = w; // _height = h; //方法二:封装成员变量的setter 方法 [self setAge:a]; //self == wangcai [self setWeight:w]; [self setHeight:h]; }
(二)构造方法(初始化对象)
1.构造方法有两种
(1)系统提供的默认的构造方法
(2)自定义的构造方法
2.
>在一般语言创建对象或者变量的时候系统自动去调用的方法叫做构造方法(这个概念了解就行,重点在下面)
遗憾的是OC在创建对象的时候不会自动调用构造方法
>构造方法的作用:在创建对象的时候对对象的成员变量做初始化
>OC中,凡是以init开头的方法 都是构造方法
>构造方法分为无参构造方法,和带参的构造方法
一个类可以有多个构造方法,在创建对象的时候根据需求去选择调用构造方法
3.1【无参构造方法】
声明的格式 :-(当前类 类型的指针 *)init;
实现的格式:
-(Dog *)init{
self = [super init];
if (self != nil) {
_name = @"Tom";
_age = 0;
}
return self;
}
【注】:一个完整的对象分为父类和当前类两部分,初始化的时候要
1)先去通过super 关键字先去初始化父类这一部分,把初始化父类操作的返回值赋值给self
2)去判断初始化父类时候的返回值,如果返回值不为空说明父类初始化成功,去初始化当前类特有的成员变量
3)返回self
3.2【带参构造方法】
实际上就是带个参数~~ so easy ~~参照set方法的带多参
3.3【对象的初始化顺序】
1)先去通过super 关键字先去初始化父类这一部分,把初始化父类操作的返回值赋值给self
2)去判断初始化父类时候的返回值,如果返回值不为空说明父类初始化成功,去初始化当前类特有的成员变量
======
(三)self的使用
1)
self:接受消息的对象或类,当前对象的指针 (指向 方法调用者)。 注意: 在类方法中,self一定指向类
super:接受消息的对象的父类,用于调用父类的成员方法。
出现的地方:所有的OC方法中(对象方法\类方法),不能出现在函数
2)作用
1> 使用 "self->成员变量名" 访问当前方法调用的成员变量
2> 使用 "[self 方法名];" 来调用方法(对象方法\类方法)
代码示例:
/* self 1.使用场合:只能用在方法(对象方法\类方法),不能用在函数中 2.每次调用方法的时候,系统会自动创建self指针 3.self指针指向方法调用者 */ #import <Foundation/Foundation.h> @interface Car : NSObject { int _wheels; } - (void)setWheels:(int)wheels; - (int)wheels; - (void)run; @end @implementation Car // 所有的成员变量(不管是不是@public),都能直接在对象方法中访问 - (void) setWheels:(int)wheels { self->_wheels = wheels; } - (int) wheels { return self->_wheels; } - (void) run { // self是一个特殊的指针,只在@implementation的方法中才有 // self其实是方法中一个内置指针,每次调用方法,都会有self这个指针 // self指针指向方法调用者 int _wheels = 10; // 利用self指针访问方法调用的成员变量_wheels NSLog(@"%i个轮子的车子飞奔起来了!", self->_wheels); } /* 错误写法:self不能用在函数中 void test() { self->_wheels = 10; } */ @end int main() { Car *c = [Car new]; [c setWheels:4]; [c run]; return 0; }
(四)对象方法和类方法
>对象方法
1)以减号-开头
2)只能让对象调用,没有对象,这个方法根本不可能被执行
3)对象方法能访问实例变量(成员变量)
>类方法
1)以加号+开头
2)只能用类名调用(通过类名直接调用),对象不能调用
3)类方法中不能访问实例变量(成员变量)
4)使用场合:当不需要访问成员变量的时候,尽量用类方法
注意: 类方法和对象方法可以同名;实例变量_xxx不能在类方法中访问。
>【类方法的三个作用】
1:简单快速的创建对象
2:如果一个功能是由多个方法协同完成的,用 类方法可以留出一个简单易用的接口
3:实现单例模式
===============
小知识点补充:
(1)
nil:如果要把对象赋值为空 用nil
Nil :如果要把基本数据类型赋值为空 用Nil
void * :可以指向任何数据类型的变量
id类型: 可以引用任何类实例化的对象 ,在给所引用的对象发消息时不需要强转
【self和super关键字】
self:接受消息的对象或类,当前对象的指针 (通过那个对象使用到self,self 就是谁)。
super:接受消息的对象的父类,用于调用父类的成员方法。
(2)对象的内存表示
//父类的成员变量
//父类的成员方法
//自身的成员变量
//自身的成员方法
(3)复合对象
用面向对象的思想把大象装进冰箱
对象 成员变量 成员函数 类
大象 age/weight/height setter/getter Elephant
冰箱 Elephant * ele opendoor/storeelephant/closedor Haier