看完了类与对象的教学视频,对面向对象的概念有更深的了解,以前学习C#的时候,对于面向对象的思想、语法、知识点都不是很透彻。其实面向对象的思想就好比我不需要知道一件事情怎么做,只需要找到会做这个事情的人,让他去完成相应的操作步骤。面向对象中的类就像我们生活中各种东西的模板,而对象就是这些模板的实例化、具体化,对象间拥有相同的属性跟功能。下面就简单总结一下OC中类与对象的知识要点。
1.类的声明与实现
OC中类的声明包括类的成员变量跟方法,其中方法包括类方法跟对象方法。对象方法:以 - 号开头,只能由对象来调用,对象方法中能访问当前对象的成员变量;类方法: 以+号开头,只能由类来调用,类方法中不能访问成员变量。其中的注意点我都写在注释里面,这样更方便理解。
@interface Car:NSObject //类的声明:要放在创建对象之前
{
@public //允许外部指针间接访问对象内部的成员变量
int wheels; // 不允许在这里进行初始化,也不能将成员变量当成C语言中的变量来使用
int speed;
}
+ (void)jump;
- (void)jump; //方法(名称 参数 返回值),OC对象方法,必须以减号 - 开头,OC方法中任何数据类型都必须用()括住
@end
@implementation Car //类的实现:用来实现@interface中声明的方法
- (void)jump
{
NSLog(@"跳!");
}
@end
int main()
{
Car *p = [Car new]; //p指向Car类型的对象,创建一个新对象,并返回新对象本身(新对象的地址)
p->wheels = 4;
p->speed = 250; // 成员变量的赋值
[p jump]; //消息机制:给p所指向的对象发送一条run消息(让对象去调用方法)
Car *p2 = [Car new];
p2->wheels = 3;
p2->speed = 200;
[p2 jump];
return 0 ;
}
2.对象与函数传参(部分代码)
通过下面一段代码来理解将指向对象的指针传给函数做参数的不同点。
void test(int w,int s)
{
w=20;
s= 200;
}
void test1(Car *newC)
{
newC ->wheels= 5; //这种可以直接修改p指向对象的值
}
void test2(Car *newC)
{
Car *c2 = [Car new]
c2->wheels = 5;
c2->speed = 300;
newC = c2; // 这种是newC最开始指向p所指向的对象,但是后来他的值被c2覆盖了
newC->wheels = 6;
}
int main()
{
Car *p = [Car new];
p->wheels = 3;
p->speed = 200;
test(p -> wheels, p -> speed);
test1(p); //注意区别三个函数
test2(p);
[p run];
return 0 ;
}
三段函数的不同点:第一个函数的形参是整数类型,完成的是值传递,所以调用test函数p所指向的对象的成员变量的值是不会变的;第二个函数的形参是指针类型,调用test1函数,p的地址值也赋给了newC,所以两个指针都指向同一个对象,将对象的wheels值修改了;第三个函数跟第二个函数传参一样,但是调用test2函数时,p的地址值赋给了newC,后来newC的值又被c2给覆盖了,所以newC指向了c2所指向的对象,p所指向的对象的成员变量的值未改变。初学者在这里容易犯的错误就是将实参直接文本替代形参,这样一来就完了,所有实参的值都改变了。
3.具有返回值带有参数的方法
#import <Foundation/Foundation.h>
@interface JiSuanQi : NSObject
- (double)pi;
- (int)pingFang:(int)num;
- (int)sumWithNum1:(int)num1 andNum2:(int)num2;
@end
@implementation JiSuanQi
- (double)pi
{
return 3.14;
}
- (int)pingFang:(int)num
{
return num * num;
}
- (int)sumWithNum1:(int)num1 andNum2:(int)num2
{
return num1 + num2;
}
@end
int main()
{
JiSuanQi *jsq = [JiSuanQi new];
int a = [jsq sumWithNum1:20 andNum2:5];
int b = [jsq pingFang:10];
double c = [jsq pi];
NSLog(@"%i,%i,%f", a,b,c);
return 0;
}
以上的一段代码,第一个方法名叫pi,第二个方法叫pingfang:,第三个方法叫sumWithNum1:andNum2:,像这种没有成员变量,方法又与成员变量无关的类叫做工具类,工具类的方法一般用类方法来实现,提高执行效率。因为调用类方法,不涉及对象的成员变量,直接在类的存储空间里调用(方法都存储在类的内存空间里),而对象方法需要创建对象,分配另一块对象的存储空间,再由对象去类存储空间里调用对象方法。
4.匿名对象
//第一段:
Car *c = [Car new];
c -> speed =200;
[c run];
//第二段:
[Car new] -> speed = 300;
[[Car new] run];
第一段代码c指向的对象调用run方法,对象是创建的唯一一个,而第二段代码[Car new]调用 run方法时又新创了一个对象,对象里的成员变量值默认为0。所以[Car new]是每次使用都会创建一个新对象,不建议这样省去指针变量创建对象。
加油!!!