oc中面向对象有三大特性,为封装,继承,多态。 封装也是成员变量的封装(保护成员变量不能被外界随便赋值。)
1: 封装
1>:set 方法:给外界提供一个方法给外界设置成员变量的值。
方法名必须以set 开头。
set 后面跟上成员变量名,且成员变量名首字母必须大写。
set 方法返回值类型必为void。
一定要接收一个参数,且参数类型跟成员变量类型一致。
形参的名称不能与成员变量名一样。
在 set 方法实现中可以对参数进行过滤。成员便令不能用@public 时,成员变量可被外面的指针变量任意赋值。
set 方法可以监听成员变量的改变。
2>: get 方法: 返回对象内部的成员的变量
肯定有返回值,且返回值类型与成员变量类型一致。
不需要有形参。
方法名就是成员变量名。
封装有set 方法来设置成员变量,用 get 方法来访问成员变量。把对象的成员变量隐藏在里面,不显示细节。保证数据的安全性。
只读: 只允许外界访问对象的某个属性,不允许外界修改这个成员变量的值。这时可以只提供get 方法不提供set 方法。
成员变量的命名,必须要以下划线开头,这样可以跟局部变量区分开来,还跟get 方法区分开。带下划线的一般都是成员变量。
oc是弱语法,oc中的方法调用时动态检测的,运行时的过程中才会检测对象有没有实现相应的方法。
例如:
@interface Person : NSObject
@end
@implementation Person
@end
int main ()
{
Person * s = [ person new ];
[s test ];
return 0;
}
这个程序中类的声明中什么也没有。类的实现也是空的。可是编译时只有一个警告,如果加上test 方法的声明,则编译无错误。链接时也可以通过,可是运行时会出现系统崩溃。因为找不到test 方法。 如果没有 test 方法的声明,但是有类的实现也是可以的,但是此时,类的实现必须在 main 函数之前。但是这样不规范、
封装的好处:把一个功能封装到一个方法中去。
过滤不合理的值。
让外界不必关注内部的细节。
类方法:可以直接用类名调用的方法。类本身会在内存中占据存贮空间,里面有方法的列表。
类方法以加号开头,只能让类调用,类方法可以与对象方法同名。在类方法中不能直接调用成员变量,。
例如:
+ void run
{
NSLog (@'' 跑起来了");
}
类方法的好处:
不依赖于对象,执行效率高。
能用类方法尽量类方法。
当方法内部不需要使用到成员变量时,就可以改为类方法。
工具类:基本没有成员变量,里面的方法基本都是类方法。
易错:
+ void run
{
[ person run ];
NSLog (@'' 跑起来了");
}
运行时什么也不输出,类方法自己调用自己,死循环。
+ void run
{
NSLog (@'' 跑起来了");
[ person run ];
}
运行中先输出,在自己调用自己,也是死循环。
self 关键字
当成员变量与局部变量同名时,采取就近原则。访问的事局部变量。用self 访问成员变量可以区分同名的局部变量。
self 只能出现在oc方法中,不能在函数中使用。
self -> 成员变量名: 访问当前对象内部的成员变量。
[ self 方法名];
// 谁调用了当前方法 ,self 就代表谁,类方法中就代表类,对象方法中就代表方法。
- void run
{
NSLog (@'' 跑起来了");
[ self run ];
}
死循环自己调用自己.
2:继承
继承是类和类之间的关系
例如:
@interface Person : NSObject
{
int age ;
double weight;
}
- void test ;
@end
@implementation Person
- void test
{
NSLog (@'' 调用 了人的 test 函数");
}
@end
@interface student : Person
@end
@implementation Person
- void test
{
NSLog (@'' 调用 了学生的 test 函数");
}
@end
继承的好处:student 继承了person 的类,student 成为子类,person 成为父类。
注意: 父类应写在子类之前,因为编辑器是从上往下编译的,所以父类先定义,子类才能使用。
oc中不允许父类和子类中有相同的成员变量。
子类中允许子类跟父类中有相同的实现方法、
如果在子类中调用某个方法,会优先在子类中找有没有这个方法的实现。找不到的话就去父类中找。每个类中都有一个super 指针,指向它的父类。 也可以在父类中声明某个方法,但不在父类中实现。在子类中实现。然后在子类中调用。但是编译时会有警告。
子类重现实现父类中的某个方法,会覆盖父类的方法,优先使用子类的。
注意:
1: 父类必须声明在子类之前,实现可在子类后面。
2:调用某个对象的方法时,会优先去当前对象对应的类中找,如果找不到就顺着super 指针去父类中找。
继承的好处: 抽取了重复代码,建立了类之间的关系。
缺点: 类之间的耦合性太强。
使用场合:
1: 当两个类拥有相同的属性和方法时,就可以将相同的东西放在一个父类中。
2:当A类拥有B类的部分属性和方法时,可以考虑让B类继承A类。
使用注意:
@interface Score: NSObject
{
int -cscore ;
int -ocscore;
}
- void test ;
@end
@implementation Score
- void test
{
NSLog (@'' 调用 了test 函数");
}
@end
@interface Student: NSObject
{
int -cscore ;
int -ocscore;
}
- void test ;
@end
@implementation Student
- void test
{
NSLog (@'' 调用 了人的 test 函数");
}
@end
虽然这两个类具有相同的属性,可是不能用student 继承score ,因为逻辑上不对。
3:多态
没有继承就没有多态,多态是指父类指针指向子类对象。
多态的好处:如果参数中使用的事父类类型,可以传入子类,父类的对象。