------- android培训、java培训、IOS培训、期待与您交流! ----------
OC三大特性
1. 封装
01. 基本语法
//set方法:成员变量的封装
#import <Foundation/Foundation.h>
@interface Student :NSObject
{
//@public 以后写成员变量除特殊情况,统统不许写@public
int age;
}
- (void)study;
//提供一个方法给外界设置age属性值
//set方法
//1>作用:提供一个方法给外界设置成员变量值,可以在方法里对输入范围进行约束
//2>命名规范:1.必须以set开头
//2.set后面跟上成员变量的名称,成员变量的首字母必须大写
//3.返回值一定是void
//4.一定要接收一个参数,而且参数类型与成员变量一致
//5.形参的名称不能跟成一团变量名称一样
- (void)setAge:(int)age;
//提供一个方法给外界获取age属性值
//get方法
//1.作用:返回对象内部的成员变量
//2.命名规范
//1>肯定有返回值,而且返回值类型与成员变量类型一致
//2>方法名跟成员变量名一致
//3>不需要接收任何参数
- (int)age;
@end
@implementation Student
- (void)setAge:(int)newAge
{
if(newAge <=0)
{
newAge =1;
}
age = newAge;
}
- (int)age
{
returnage;
}
- (void)study
{
NSLog(@"%d岁的学生在学习",age);
}
@end
02. 对象方法,成员变量
//成员变量的命名规范:一定要以_开头
//作用:
//1>让成员变量和get方法的名称区分开
//2>可以跟局部变量分开,一看到下划线开头的变量,一般都是成员变量
typedefenum {
SexMan,
SexWoman
} Sex;
@interface Student :NSObject
{
int _no;
Sex _sex;
}
- (void)setSex:(Sex)sex;
- (Sex)sex;
- (void)setNo:(int)no;
- (int)no;
@end
@implementation Student
- (void)setSex:(Sex)sex
{
_sex = sex;
}
- (Sex)sex
{
return_sex;
}
- (void)setNo:(int)no
{
_no = no;
}
- (int)no
{
return_no;
}
@end
03. 类方法
//对象方法:
//1>由-开头
//2>只能由对象来调用
//3>对象方法恩能够访问当前对象的成员变量
//类方法:
//1>由+开头
//2>只能由类来调用
//3>实例变量不能在类方法中访问
//类方法的好处和使用场合
//1>不依赖于对象,执行效率高
//2>能用类方法尽量用类方法
//3>场合:当方法内部不需要使用到成员变量
@interface Person :NSObject
//类方法:加号开头 放在类的储存空间里
//某些情况下把经常使用且不改变的方法设定为类方法可以提升效率
+ (void)printClassName;
@end
@implementation Person
+ (void)printClassName
{
NSLog(@"这个类叫做Person");
}
@end
int main()
{
Person *p = [Personnew];//由类调用的方法
//[p test];//由对象调用的方法
[PersonprintClassName];
return0;
}
//
// main.m
// OC三大特性-01-封装-07类方法练习
//
// Created by apple on 15-4-8.
// Copyright (c) 2015年apple. All rights reserved.
//
#import <Foundation/Foundation.h>
//设计一个计算器类
@interface JiSuanQi :NSObject
+ (int)sumOfNum1:(int)num1 andNum2:(int)num2;
+ (int)averageOfNum1:(int)num1 andNum2:(int)num2;
@end
@implementation JiSuanQi//工具类,不需要用到成员变量,改为类方法
+ (int)sumOfNum1:(int)num1 andNum2:(int)num2
{
return num1 +num2;
}
+ (int)averageOfNum1:(int)num1 andNum2:(int)num2
{
//功能封装,这样写方便代码重构
int sum = [JiSuanQisumOfNum1:num1andNum2:num2];
return sum/2;
}
@end
int main()
{
int a = [JiSuanQisumOfNum1:10andNum2:6];
int b = [JiSuanQiaverageOfNum1:10andNum2:6];
NSLog(@"%d\t%d",a,b);
return0;
}
2. 继承
01. 继承的好处
//继承的好处:
//1>抽取重复代码
//2>建立了类之间的关系
//3>子类可以拥有父类中得所有成员变量和方法
//2注意点
//1>基本上所有的类都是继承于NSObject这个根类
@interface Animal :NSObject
{
int _age;
double _weight;
}
- (void)setAge:(int)age;
- (int)age;
- (void)setWeight:(double)weight;
- (double)weight;
@end
@implementation Animal
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return_age;
}
- (void)setWeight:(double)weight
{
_weight = weight;
}
- (double)weight
{
return_weight;
}
@end
//狗************************************************
@interface Dog :Animal //继承了Animal,拥有了Animal的所有成员变量和方法
//Animal称为Dog的父类,Dog称为Animal的子类
@end
@implementation Dog
@end
//猫************************************************
@interface Cat :Animal
@end
@implementation Cat
@end
//
int main()
{
Dog *d = [Dognew];
[d setAge:10];
NSLog(@"age=%d",[dage]);
return0;
}
02. 使用注意
//基本上每个对象里有一个isa指针,指向对应的类
//每个类里有一个superclass指针,指向对应的父类
//类里储存的是方法列表,包含+的类方法和-的对象方法
#import <Foundation/Foundation.h>
//注意点:
//1>父类必须写在子类的前面
//2>子类不能拥有与父类相同的成员变量
//3>调用某个对象方法的时候,优先取当前对象中找,找不到逐层去父类中找
//坏处:
//耦合性太强,如果父类被删了,子类就废了
@interface Person :NSObject
{
int _age;
}
- (void)setAge:(int)age;
- (int)age;
- (void)run;
@end
@implementation Person
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return_age;
}
- (void)run
{
NSLog(@"Person->pao");
}
@end
//OC中不允许子类和父类拥有相同名称的成员变量
@interface Student :Person
{
int _no;
//错误int _age;
}
@end
@implementation Student
//方法名可以相同
//重写:子类重新实现父类的某个方法
//覆盖父类以前的做法
- (void)run
{
NSLog(@"student->run");
}
@end
int main()
{
Student *s = [Studentnew];
[s run];//优先在Student中找run方法,没有->父类,没有->继续向上
return0;
}
03. 继承与组合
//继承的使用场合;
//1>当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中
//2>当A类拥有B类的部分属性和方法时,可以考虑让B类继承A类
//得符合人的逻辑
//继承:xxx是xxx
//组合:xxx拥有xxx
//另一种做法:组合
@interface Score :NSObject
{
int _cScore;
int _ocScore;
}
@end
@implementation Score
@end
@interface Student :NSObject
{
//得符合人的逻辑
//继承:xxx是xxx
//组合:xxx拥有xxx
Score *_score;
// int _cScore;
// int _ocScore;
int _age;
}
@end
@implementation Student
@end
04. super
//super的作用
//1>直接调用父类中得某个方法
//2>super处在对象方法中,那么就会调用父类的对象方法
// super处在类方法中,那么就会调用父类的类方法
//3>比较常见的使用场合:子类重写父类的方法时想保留一部分父类的内容
//植物大战僵尸
//僵尸类:
//跳跃僵尸,舞王僵尸,铁通僵尸等
@interface Zoombie :NSObject
- (void)walk;
- (void)test;
+ (void)test;
@end
@implementation Zoombie
- (void)walk
{
NSLog(@"往前走两步");
}
- (void)test
{
NSLog(@"haha");
}
+ (void)test
{
NSLog(@"hahaha");
}
@end
//跳跃僵尸
@interface JumpZoombie :Zoombie
@end
@implementation JumpZoombie
- (void)walk
{
NSLog(@"跳两下");
// NSLog(@"往前走两步");
[superwalk];
//super:调用父类的walk方法
}
@end
int main()
{
JumpZoombie *jz = [JumpZoombienew];
[jz walk];
[JumpZoombietest];
return0;
}
3. 多态
01. 基本
//多态:
//1>没有继承就没有多态
//2>代码的体现:父类类型的指针指向子类对象
//3>好处:如果函数/方法参数中使用的时父类类型,可以传入父类好子类对象
//4>局限性:父类类型的变量不能直接调用子类特有的方法,必须强转为子类类型变量后,才能调用
@interface Animal :NSObject
- (void)eat;
@end
@implementation Animal
- (void)eat
{
NSLog(@"Animal eat---");
}
@end
//没有继承就没有多态
@interface Dog :Animal
- (void)run;
@end
@implementation Dog
- (void)eat
{
NSLog(@"Dog eat-----");
}
- (void)run
{
NSLog(@"run~~~~~~~~");
}
@end
//猫
@interface Cat :Animal
@end
@implementation Cat
- (void)eat
{
NSLog(@"cat eat-----");
}
@end
//专门喂动物的函数
//void feed(Dog *d)
//{
// [d eat];
//}
//
//void feed2(Cat *c)
//{
// [c eat];
//}
//如果参数中使用的时父类类型,那么父类,子类对象都可以传入,避免函数0
//重写
void feed(Animal *a)//多态的好处
{
[a eat];
}
int main()
{
//多种形态
// Dog *d = [Dog new];//Dog类型
//
// feed(d);
//
// //多态:父类指针指向子类对象
// Animal *d1 = [Dog new];//动物形态
//
// //这也是多态
// //NSObject *a = [Dog new];
//
// [d eat];
//
// [d1 eat];
//
// //多态的使用注意:
// //由于OC的弱语法,这样写是可以正确赋值的,但是这样不符合人的逻辑,不要这样写
// //Cat *c = [Animal new];
// Animal *c = [Cat new];
//
// feed(c);
//
// [c eat];
//多态的局限性:父类类型的变量,不能用来调用子类的方法
Animal *aa = [Dognew];
Dog *dd = (Dog *)aa;//得需要将aa强制转换为Dog*类型的变量
[dd run];
//Dog *d = [Dog new];
//[d run];
return0;
}
02. self语法
//self用途
//1>概念:指向了当前对象(方法调用者)
//*self出现在对象方法中,self就代表对象
//*self出现在类方法中,self就代表类
//2>可以利用"self->成员变量名"访问当前对象内部的成员变量
//3>[self方法名]可以调用其他对象方法活着类方法
//#import<Foundation/Foundation.h>
//
//@interface Dog :NSObject
//
//- (void)bark;
//- (void)run;
//
//@end
//
//
//@implementation Dog
//
//- (void)bark
//{
// NSLog(@"wangwangwang");
//}
//
//- (void)run
//{
// [self bark];
//
// NSLog(@"pao");
//}
//
//@end
//
//
//
//int main()
//{
// Dog *d = [Dog new];
//
// [d run];
//
// return 0;
//}
//self使用注意
#import <Foundation/Foundation.h>
@interface Person :NSObject
- (void)test;
+ (void)test;
- (void)test1;
+ (void)test2;
void test();
@end
@implementation Person
- (void)test
{
NSLog(@"调用了-test方法");
[selftest];//死循环
}
+ (void)test
{
NSLog(@"调用了+test方法");
[selftest];//死循环
}
- (void)test1
{
[selftest];//-test
}
+ (void)test2
{
[selftest];//+test
}
void test()
{
printf("haha\n");
}
@end