您的位置:首页 > 编程语言 > C语言/C++

黑马程序员—OC语言基础—面向对象的三大特性(1)

2015-05-05 10:42 399 查看
————————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]; //会引起死循环
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: