继续上次的oc面向对象的学习,加油!!!
写之前想说一句:好倒霉啊。在csdn保存的博客没了,电脑断电没保存笔记。重新开始写,黑马让我坚持。
目录:
1.错误与解决
2.深入理解oc面向对象
3.oc三大特性
4个人总结
一:错误与解决
状态来了,感觉良好,错误不是很多,但挺”笨“的错误。
1.我又把-framework Foundation 忘了。哎,笨死我了。
2.方法和函数区别没有很好的区分。下面会有详细记录
3 方法的调用又出现了Object.method ,java通病
二:深入理解oc面向对象
a.方法和函数的区别(重点)
1.区别:
对象
1.对象方法都是以减号-开始
2.对象方法的声明必须写在@interface @end 之间对象方法的实现必须写在@implementation和@end中
3.对象方法只能由对象来调用
4.对象方法归类\对象所有
函数
1.函数能写在文件的任何位置(@interface和@end之间),函数归文件所有
2.函数的调用不依赖于对象
3.函数内部不能直接通过成员变量访问某个对象的成员变量
总的来说:方法是对象特有,方法随对象的存在而存在。而函数和对象没有任何关系,函数可以调用对象内的方法,甚至可以修改对象的状态。但是必须注意,函数在调用对象的实例变量的时候,如果对象没有创建函数式不能调用实例变量的,否则报错。
2.方法的使用:
如果是一个参数的方法,那么定义是很简单的:(减号注意)
如果方法定义多个参数,那么oc很人性化!
可以看到,每个参数之前都会有说明,这样的方法易于交流和后期开发,读起来像句子。比如:定义一个add方法,java中:public int add(int a,int b); 。而oc中,(int)ad(int)Num1andNum2:(int)Num2;很明显一看到方法定义我们就明白他的目的是什么。
3.注意:
冒号也是方法名的一部分
同一个类中不允许两个对象方法同名
b.类的合理设计
理解面向对象的思想并不是说明就可以设计出好的类。李明杰老师的例子我感觉挺经典的。记下来了
typedef enum
{
SexMan,//技巧,一看到就能理解
SexWoman
}Sex;
typedef strut
{
int year;
int month;
int day;
}Date;
typedef enum
{
ColorBlack,
ColorRed,
ColorGreen
}Color;
//狗
@interface Dog
{
doubleweight;//体重
Color curColor;//毛色
}
-(void)eat;
-(void)run;
@end
@
/*学生
成员变量:性别,生日,体重,最喜欢的颜色、狗(体重,毛色,吃,跑)
方法:吃,跑步。遛狗。喂狗
*/
#import<Foundation/Foundation.h>
@interface Student:NSObject
{
Sex sex;//性别
Date birthday;//生日
double weight;//体重(kg)
Color favColor;
Dag *dog;
}
-(void)eat;
-(void)run;
-(void)liuDog;
-(void)weiDog;
@end
@implementation Student
-(void)eat
{
weight += 1;
NSLog(@"吃完这次之后的体重是%f",weight);
}
-(void)run
{
weight -= 1;
NSLog(@"吃完这次之后的体重是%f",weight);
}
@end
@implementation Student
-(void)eat
{
weight += 1;
NSLog(@"吃完这次之后的体重是%f",weight);
}
-(void)run
{
weight -= 1;
NSLog(@"吃完这次之后的体重是%f",weight);
}
-(void)liuDog
{
[dog run];
}
-(void)weiDog
{
[dog eat];
}
@end
int main()
{
Student *s = [Student new];
Dog* dog = [Dog new];
d->weight = 20;
d->curColor = ColorGreen;
s->weight = 50;
Date d = {2011,9,10};
s->birthday = d;//结构体不能声明完之后再赋值,应该声明和赋值一起
[s liuDog];
[s weiDog];
return 0;
}
可以看到:对象在用其他对象。这也是面向对象的核心和重点。Student对象调用了dog对象中的方法。
c:官方文档的使用
java中提供的官方文档为开发带了大量的好处,程序员根据API适时查阅,统一了工作进度。同样apple也给我们带来了ios等官方文档,它更统一,更具体。可以和xcode完美介入。
方法:xcode -> help -> documentation......
三: oc 三大特性
封装,基础,多态
封装:我们把实例变量封装在类中,通过set和get方法来访问和设置对象的状态。提高了安全性
(来自李明杰老师讲义)
set方法
作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值
命名规范:
方法都是以set开头,而且后面跟上成员变量名,成员变量名的首字母必须大写
形参名称不要跟成员变量同名
get方法
作用:返回对象内部的成员变量
命名规范:
get方法的名称一般就跟成员变量同名
成员变量的命名规范
成员变量都以下划线 _ 开头
可以跟get方法的名称区分开
可以跟其他局部变量区分开,一看到下划线开头的变量,肯定是成员变量
例子:
比如定义:_age;
setAge();
Age();
继承:
理解:子类和父类的关系(animal类和dog类的关系)。子类比父类更加强大,一个父类可能会有多个子类。但这样的代码耦合性很高(你中有我,我中有你)。
特点:
不改变原来的模型的基础上,拓充了方法
建立了类与类之间的联系
抽取了公共的代码
坏处:耦合性强
使用:
is和has的区别
比如:我是人,那么我就可以继承person类。狗是动物,那么狗就可以继承animal类。但是,我们不能说,发动机继承汽车,只能说汽车有发动机。
多态:
定义:
某一类事物的多个状态(来自于继承)
表现:
Person *p = [Student new];
p->age =100;
[p walk];
子类对象赋值给父类指针
父类指针访问对应的属性和方法
作用:
父类接受参数,可以节省代码,而且使代码统一。
Person *p = [Student new];可以
Student *s= [Person new];不可以
四:个人总结
oc语法进入三大特性后,开始有点吃力了。要求的细节也越来越多。需要有完全的理解。今天的学习整体还是比较在状态的。感觉黑马老师讲课够激情啊!老师键盘打的,啪啪响!!!
希望黑马收下我。
------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------