[置顶] OC基础(一)面向对象

一、OC概述

1.简介

OC是基于C,所以在代码上是完全兼容C的。在OC中,你可以使用C的语法,甚至C++的语法。

C是面向过程的语言,而OC是面向对象的语言。

2.关键字

OC中的关键字都以“@”开头。

如:@public、@string


二、面向对象

1.面向对象和面向过程

是考虑事情的2种不同思想。面向过程,考虑的是做事情需要哪些步骤,面向对象考虑的则是谁能做这些事。

就比如:我想打电话

面向过程:开机->找到通讯录->拨打号码

面向对象:找手机

C是面向过程的语言,OC是面型对象的语言,其实OC的核心本质还是面向过程的语言,只是苹果给OC披了一层面向对象的外套。

2.OC中的面向对象

1)要想创建一个类的对象,必须先有该类的声明。在类的声明中,可以声明类的属性和方法。

2)然后,进行类的实现,主要就是对类中的方法进行实现。

3)创建类的对象,并赋值。需要用指针,在OC中,操作对象一定且只能用指针。

3.OC中的"[]"和”()“

1)在OC中,行为要使用”[]“。

如:创建对象:Person *p =[Person new];

       调用方法:[p walk];

2)在OC中,”()“只能用于括住数据类型,不能乱用,更不能作为方法的后缀。

4.实例

#import <Foundation/Foundation.h>
@interface Person : NSObject
{
    @public
    double weight;
    int age;
}
- (void)walk;

@end

@implementation Person

- (void)walk
{
    NSLog(@"某人有%d岁,体重为%fkg,有走路的方法!",age,weight);
}

@end
int main()
{
    Person *p1 = [Person new];
    p1->weight=89.2;
    p1->age=30;
    NSLog(@"年龄为%d,体重为%f",p1->age,p1->weight);
    
    [p1 walk];//指针对象向Person对象发送消息,调用方法,那么对象的属性也可以直接用
    
    Person *p2 =[Person new];
    p2->weight=90.2;
    p2->age =40;
    
    p1=p2;
    
    p1->age=50;
    
    [p2 walk];
    return 0;
}
解析:

1)类的声明

使用”@interface ...@end“,且必须继承NSObject,由于该类位于Foundation框架中,所以必须导入该框架。

2)属性声明

使用"{}",可以使用@public关键字,在该关键字之后的属性都是共有的。

3)方法声明

必须严格遵守格式:

如:- (void)run;

如:- (void)eat;

4)类的实现

使用"@implementation...@end"。

5)方法的实现

要想使用声明的方法,必须实现该方法。格式:

如:- (void)run{...}

6)创建对象和赋值

Person *p = [Person new];//新建一个指针对象,指向新建的Person对象

p->weight=120.8;//创建指针对象就是为了操作该对象,并赋值。

p->age=30;

7)调用类的方法

[p run];


三、类

1.类

类是抽象的,是对具有相同特征的事物的抽象描述。

对象是具体的,是类的实例。

2.类的设计

类的设计只需关心三点:

1)事物名称:类名

2)属性

3)行为

3.类的声明和实现

在OC中,虽然可以将类的声明和实现合并到一起,但是不建议这么做。推荐将类的声明和类的实现分开写,先有类的声明,再有类的实现。

在OC中,对类的任何操作都需要用到指针,而且只能使用指针。

声明:@interface ...@end

实现:@implementation...@end

4.类的属性和方法

1)如果想要类的属性(成员变量),能够被外界对象随意访问,可以将成员变量设置为@public。在@public之后的所有成员变量的权限都是public。

    @public 
    int wheel;
    int speed;
2)OC中的方法和C中的函数是2个不同的概念,在OC中,只说方法。在OC中的“()”只能用来括住数据类型,参数列表不能使用括号。

- (void)run:(int)age

5.注意

  1. 在类的声明中,只能有成员变量的声明,不能赋值或者声明为静态的。

  2. 在@interface...@end之间不能嵌套其它的@xx...@end

  3. 对实现的方法,也不能使用static修饰,只有函数才有这种用法。

  4. 类的声明必须放在该类的对象创建之前,类的实现可以放在后面,因为编译是从前向后执行的。

6.函数和方法的区别

1)方法

1->对象方法都已“-”开头

2->对象方法的声明必须放在@interface...@end之间

对象方法的实现必须放在@implementation...@end之间。

3->对象方法必须由对象进行调用,函数则不需要。

2)函数

1—>函数能写在文件中的任意位置,函数归文件所有。

2->函数调用不依赖于对象

3->函数有参数列表,有“()” 

7.类的合理设计

//如果结果只有固定的取值,使用枚举
typedef enum{
    SexMan,//取值一般以枚举类型开头,前面也可以加"k"表示常量
    SexWomen
} Sex; //Sex为枚举类型
typedef struct{ //创建结构体
    int year;
    int month;
    int day;
} Date;
typedef enum{   //创建枚举类型
    ColorBlack, //第0个元素
    ColorRed,
    ColorGreen
} Color;
#import <Foundation/Foundation.h>
@interface Student : NSObject
{
    @public
    Sex sex;//性别
    Date birthday;//生日
    double weight;//体重
    Color favColor;//喜欢的颜色
    char *name;//姓名
}
- (void)eat;
- (void)run;
- (void)print;
@end
@implementation  Student
- (void)eat
{
    weight +=1;
    NSLog(@"吃完这次后体重是%f",weight);
}
- (void)run
{
    weight -=1;
    NSLog(@"跑完体重是%f",weight);
}
- (void)print
{
    NSLog(@"性别=%d,喜欢的颜色=%d,姓名=%s,生日=%d-%d-%d",sex,favColor,name,birthday.year,birthday.month,birthday.day);
}
@end
int main()
{
    Student *s1=[Student new];
    s1->weight=50;
    s1->sex=SexMan;
    s1->name="jack";
    Date d = {1988,10,22};//创建结构体
    s1->birthday=d;//birthday的数据类型为结构体
    s1->favColor=ColorBlack;
    
    [s1 eat];
    [s1 eat];
    
    [s1 run];
    [s1 run];
    [s1 print];
    return 0;
}



你可能感兴趣的:(面向对象,oc)