OC语言之三大特性

本文深入探讨了面向对象编程的核心概念,包括封装、继承和多态性。详细解释了封装的作用、方法(set和get)的命名规范、类方法的特点以及如何在内存中表现类和对象。接着,阐述了继承的好处、注意事项和重写的概念。最后,通过实例演示了多态性的应用,展示了如何利用父类指针调用子类特有的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、封装

首先说封装的好处,如果把类的成员变量前加@public,这样数据会不安全(即数据没有被封装),因为此时外界可以随意的调用成员变量,去改变值、访问值(即暴露)。面向对象的思想是对象内部结构不要暴露给外界。所以使用封装更加安全。

1、set方法

*给外界提供一个方法,用来对成员变量赋值

*set方法中可以对参数进行相应的的过滤

命名规范:

1>方法必须以set开头

2>set后面跟上成员变量的名称,成员变量的首字母必须大写

3>返回值一定是void

4>一定要接收一个参数,而且参数类型跟成员变量类型一致

5>形参名不能跟成员变量名一样

@interface Student : NSObject
{
//成员变量的命名规范:以下划线开头
//成员变量尽量不用@public
int _age;
}
- (void)setAge:(int)age;
@end
@implementation
- (void)setAge:(int)newAge
{
//对传来的参数进行过滤
if(newAge<=10)
{
newAge = 1;
}
_age = newAge;
}
@end
int main()
{
Student *stu = [Student new];
[stu setAge:10];
reutrn 0;
}


2、get方法

*返回对象内部的成员变量

命名规范:

1>肯定有返回值,返回值类型与成员变量一致

2>方法名跟成员变量名一致

3>不需要接收任何参数

@interface Student : NSObject
{
//成员变量的命名规范:以下划线开头
//成员变量尽量不用@public
int _age;
}
- (int)age;
@end
@implementation
- (int)age
{
return _age;
}
@end
int main()
{
Student *stu = [Student new];
//获取成员变量age,默认为0
int a = [stu age];
reutrn 0;
}

/*报错收集

error-[Person test]:unrecognized selector sent to instance 0x7fd2ea4097c0

意为给地址为0x7fd2ea4097c0Person对象发送了一个不能识别的消息:test为对象方法。因为OC使用了消息机制,所以调用对象的方法即是给对象发送消息。OC在运行过程中才会检测对象有没有实现相应的方法。

*/

类方法:

1>加号 开头

2>只能由类(名)来调用

3>类方法中不能访问成员变量(实例变量)

 

类方法的好处:

1>不依赖于对象,执行效率高

2>能用类方法,尽量用类方法

3>当方法内部不需要使用到成员变量时,就可以改为类方法

4>类方法名可以与对象方法同名

 

self的用法:

1、在对象方法里调用成员变量“self->_age

2、调用当前对象方法或类方法“[self method]


类和对象在内存中的变现形式:



注:类在使用之前会加载到内存中,并且把所有的方法(对象方法和类方法)放入方法列表中,而成员变量(实例变量)只有当创建对象(创建实例)的时候才会存在内存中。


二、继承

//Pserson继承了NSObject根类
@interface Person : NSObject
char * _name;
int _age;
- (void)method1;
+ (void)method2;
@end
@implementation
...
@end
//Tom继承Person,拥有Person中的所有成员变量和所有方法,Person称为父类,Tom称为子类
@interface Tom : Person
@end
@implementation
@end

继承的好处:

1、抽取重复代码

2、建立了类之间的关系

3、子类可以拥有父类中所有成员变量和方法

 

缺点:耦合性太强

 

继承注意:

1、父类至少要声明在子类前面

2、不允许子类和父类拥有相同名称的成员变量

3、调用某个对象的方法时,优先去当前对象中找。如果找不到,去父类中找。如果子类和父类中有相同名字的对象方法或相同名字的类方法,则为重写。

 

重写:子类重新实现父类中的某个方法,覆盖父类以前的做法。

 

继承的内存示意图:


继承使用场合:

1、当两个雷拥有相同的属性和方法时,可以将相同的东西抽取到一个父类中

2、当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A

 

有时候一个类完全拥有另一个类的部分属性和方法,但是两个并无太大关系,所以应该考虑使用组合,而不是一味的使用继承,如下:

@interface Score : NSObject
{
<span style="white-space:pre">	</span>int _cScore;
	int _ocScore;
}
@end

@implementation Score
@end
// 继承:xx是xxx
// 组合:xxx拥有xxx
@interface Student : NSObject
{
	// 组合
	Score *_score;
	// int _cScore;
	// int _ocScore;
	int _age;
}
@end

关键字:super

作用:

1、直接调用父类中的某个方法

2、super处在对象方法中,调用父类的对象方法

       super处在类方法中,调用父类的类方法(取决于当前环境)

3、使用场合:子类重写父类的方法时想保留父类的一些行为


三、多态

   父类指针指向子类对象

   调用方法时会检测对象的真实形态

@interface Animal : NSObject
- (void)method;
@end
@implementation
- (void)method
{
NSLog(@”Animal’s method”);
}
@end
@interface Dog : Animal
@end
@implementation
- (void)method
{
NSLog(@”Dog’s method”);
}
@end
int main()
{
//父类指针指向子类对象
Animal *a = [Dog new];
//访问的是Dog的method方法,动态绑定
[a method];
return 0;
}

多态的好处:如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象

 

多态的局限性:父类类型的变量不能用来调用子类特有的方法,如果要调用,那么就将父类对象强制转换成子类对象,例如“(Dog *)animal”。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值