————————Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———————
一、面向对象的三大特性
面向对象的三大特性为封装、继承、多态。
下面我们一个一个来讨论每一个特性的特点与用法。
二、封装
1.封装的理解
封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。
封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。因此,封装就有一个很大的好处就是保证数据的安全。下面我们通过一个例子来了解一下如何保证安全性。
@interface Student : NSObject
{
//@public 不写public后面的对象就不可以随意修改
int age;
}
@end
注:成员变量尽量不要用@public,写了public可在后面随意修改。
可是我们在后面的程序中又想调用这个成员变量怎么办呢?
这时就需要用到set方法和get方法。
2.set方法
set方法的作用是提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应过滤。
set方法的命名规范(1)方法名必须以set开头;
(2)set后面必须跟上成员变量的名称、成员变量首字母必须大写;
(3)返回值一定是void;
(4)一定要接受一个参数,而且参数类型跟成员变量类型一致;
(5)形参的名称不能跟成员变量一样。
set方法的声明:
- (void)setAge:(int)newAge;
set方法的实现:
- (void)setAge:(int)newAge
{
// 对传进来的参数进行过滤
if (newAge <= 0)
{
newAge = 1;
}
age = newAge;
}
注:[对象 SetAge:10] 表示将10赋值给_age
3.get方法
get方法的作用:返回对象内部的成员变量。
get方法的命名规范:
1)肯定有返回值,返回值类型肯定与成员变量一致;
2)方法名与成员变量;
3)不需要接收任何参数。
get方法的声明:
- (int)age;
get方法的实现:
- (int)age
{
return age;
}
这里第一个age为方法名,第二个age为成员变量。
main函数中如果要调用,方法如下:
[Student age];
4.封装的好处(隐藏内部细节)
说白了就是将赋值变成方法,把细节隐藏,保证数据的安全性与封装;
如果某些成员变量只允许外界只读,那么提供一个get方法;
如果某些成员变量只允许外界只写,那么提供一个set方法;
set方法可以在输入时根据要求任意操作、监听。
注:一般我们定义成员变量时,开头加下划线_命名,以便成员变量与局部变量区分开来。这样能让程序员一目了然,看到有_的变量名就一定是成员变量。
三、弱语法
弱语法的意思是有些不规范的编程语言,只会报警告,不会报error。
比如:C语言中,如果main函数中调用一个未定义的函数abcd();则编译时只会报warning,但链接时会报错。
下面总结一些弱语法错误:
1.方法没有声明没有实现,在调用方法时,编译会有warning链接不报error,但运行时会报错。
- [Student test]:unrecognized selector sent to instance;
2.有声明,没有实现---->编译warning,链接无措,但依旧无法运行可执行文件。
3.无声明,有实现---->可以顺利编译,链接,且可执行。
所以是允许有实现声明的,只是会warning。
四、self关键字的用法
self是一个指针,指向调用当前方法的那个对象,即访问当前对象的内部的成员变量。
例如
//类的声明
@interface Person : NSObject
{
int _age; //年龄
}
//set方法声明
- (void)setAge:(int)age;
//get方法声明
- (int)age;
- (void)test;
@end
//类的实现
@implementation Person
- (void)setAge:(int)age
{//当前类的年龄
self->_age = age;
}
- (int)age
{
return self->_age;
}
- (void)test
{
//int _age = 20; 不可以直接修改_age的值,只能用set方法修改
NSLog(@"Person的年龄为%d岁", self->_age);
}
@end
从上面程序告诉我们:
self的用途是指向了当前对象(方法调用者),可以利用“self->成员变量名”访问当前对象内部的成员变量。
另外我们还可以用[self 方法名]来调用其他对象方法或者类方法。
总结:
1)如果实现中有函数,特别注意,函数是归文件所有的,随便在哪里调用,与对象无关,而self只能调用对象方法或类方法!
2)谁调用了当前方法,self就代表谁;
(1)如果self出现在对象方法中,self就代表对象
(2)如果self出现在类方法中,self就代表类;
3)self的使用不当会引发死循环,如方法自己指向自己就会引起死循环;例子如下:
- (void)test
{
NSLog(@"调用了-test方法");
[self test]; //会引起死循环
}