黑马程序员-IOS-OC基础-面向对象语法

-------------------------------------- android培训java培训、ios培训期待与您交流! ---------------------------------

 面向对象和面向过程思想

1、OC是面向对象的,C是面向过程的。面向对象和面向过程只是解决问题的两种不同思想

1.    面向对象和面向过程的区别

1)      以用电脑听歌为例子

a)       面向过程

* 打开电脑

* 播放电脑中的歌曲

* 关闭电脑

 

b)       面向对象(不是相亲的“对象”)

* 电脑  

²   开机  

²   播放歌曲  

²   关机

 

2)      区别分析

*面向过程关注的是解决问题需要哪些步骤;面向对象关注的是解决问题需要哪些对象

*没有开发经验很难感受到它们的区别,两种思想都能达到解决问题的目的,但是解决思路不一样

*  常用术语

* 面向过程 ProcedureOriented

*面向对象 ObjectOriented,简称OO

*面向对象编程 ObjectOriented Programming,简称OOP

 类和对象的关系

1.    如何创建对象

1)   面向对象解决问题的时候必须有对象,那如何创建对象呢?

 

2)   现实生活的例子:如何创造汽车对象?

a)       需要先有汽车的建造图纸,图纸上描述清楚汽车应该具备的属性和功能(行为)

* 属性:轮子数、时速

功能(行为):跑

b)       然后再根据图纸上的描述生成汽车

c)       每一辆汽车都是对象,都有自己具体的属性值,都是图纸的实例

d)      图纸是抽象的,房子是具体的。图纸是对房子对象的高度概括

 

2.    OC中的面相对象

1)   OC中的相当于图纸,用来描述一类事物。也就是说,要想创建对象,必须先有类

2)   OC利用类来创建对象,对象是类的具体存在

3)   因此,面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象

/*
 类名:Car
 属性:轮胎个数、时速
 行为:跑
*/

#import 

// 完整的写一个函数:函数的声明和定义(实现)
// 完整的写一个类:类的声明和实现

// 1.类的声明
// 用来声明对象的属性、行为
// (: NSObject) 目的是:让Car这个类具备创建对象的能力
@interface Car  : NSObject
{// 用来声明对象属性(实例变量/成员变量,默认会初始化为0)
    @public//可以让外部的指针间接访问对象内部的成员变量
    int wheels; // 轮胎个数
    int speed; // 时速(xx km/h)
}

// 方法(行为):方法名、参数、返回值(声明、实现)
// 只要是oc对象的方法,必须以减号- 开头
// oc方法中任何数据类型都必须用小括号( )括住
// oc方法中的小括号():括住数据类型
- (void) run;

@end



// 2.类的实现
// 用来实现@interface中声明的方法
@implementation Car

// 方法的实现(说清楚方法里面有什么代码)
- (void) run
{
    NSLog(@"车子跑起来了");
}
@end

int main()
{
    // 在oc中,想执行一些行为,就写上一个中括号[ 行为执行者  行为名称 ]
    // 利用类来创建对象
    // 执行了Car这个类的new行为来创建新对象
    
    // 定义了一个指针变量p。p将来指向的是Car类型的对象
    // [Car new ]每次都会创建出一个新对象,并且会返回新对象本身(新对象的地址)
    Car *p = [Car new];
    
    Car *p2 = [Car new];
    p2->wheels = 6;
    p2->speed = 300;
    [p2 run];
    
    // 给p所指向对象的wheels属性赋值
    p->wheels = 4;
    
    p->speed = 250;
    
    // 给p所指向对象发送一条run消息
    [p run];
    
   
    NSLog(@"车子有%d个轮子,时速为%dkm/h",p->wheels,p2->speed);
    
    return 0;
}

/*
 人
 类名:Perpson
 属性(实例变量\成员变量):体重、年龄
 行为(方法):走路
*/

/* 1.类的声明
      *成员变量:{}里面
      *方法的声明:{}外面
 */
#import 

@interface Perpson : NSObject
{
    @public
    double weight;
    int age;

}

- (void) walk;

@end

// 类的实现
@implementation Perpson


- (void) walk
{
    NSLog(@"%d岁、%.1f公斤的人走了一段路",age,weight);

}

@end


int main()
{
   Perpson *p = [Perpson new];
    p->age = 25;
    p->weight = 65.5;
    [p walk];
    
    
    Perpson *p2 = [Perpson new];
    p2->age = 26;
    p2->weight = 62.3;
    [p2 walk];
    return 0;
}

类的声明和实现

1.       @interface和@implementation的分工

黑马程序员-IOS-OC基础-面向对象语法_第1张图片

u  @interface就好像暴露在外面的时钟表面

u  @implementation就好像隐藏在时钟内部的构造实现

 

2.       声明和定义多个类

 

3.       常见错误

l   只有类的声明,没有类的实现

l   漏了@end

l  @interface和@implementation嵌套

l   两个类的声明嵌套

l   成员变量没有写在括号里面

l  方法的声明写在了大括号里面

 

4.       语法细节

l  成员变量不能在{}中进行初始化、不能被直接拿出去访问

l  方法不能当做函数一样调用

l  成员变量\方法不能用static等关键字修饰,别跟C语言混在一起(暂时忽略)

l  类的实现可用写在main函数的后面,主要在声明后面就行了

 

5.       OC方法和函数的区别

l  OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在

l  C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有

l  C函数不能访问OC对象的成员

l  低级错误:方法有声明,但是实现的时候写成了函数

 

6.  OC的方法注意

l  方法只有声明,没有实现(经典错误)

l  方法没有声明,只有实现(编译器警告,但是能调用,OC的弱语法)

l  编译的时候:访问没有的成员变量直接报错,访问没有的方法,只是警告

 

7.       @implementation

Ø   没有@interface,只有@implementation,也是能成功定义一个类的

@implementation Car: NSObject

{

    @public

    int wheels; //多少个轮子

    int speed; //时速

}

- (void) run

{

    NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels,speed);

}

@end

Ø   @implementation中不能声明和@interface一样的成员变量

 

二、  方法

设计一个Caculator计算器类,它拥有计算的功能(行为)

1.       不带参数的方法

u  设计一个返回PI的方法

// 方法声明

- (double)pi;

//方法实现

- (double)pi

{

    return 3.14;

}

黑马程序员-IOS-OC基础-面向对象语法_第2张图片


u  方法调用


黑马程序员-IOS-OC基础-面向对象语法_第3张图片

2.       带一个参数的方法

u  设计一个计算平方的方法

// 方法声明

- (double)square:(double)number;

//方法实现

- (double)square:(double)number

{

    return number * number;

}

黑马程序员-IOS-OC基础-面向对象语法_第4张图片

u  方法调用

黑马程序员-IOS-OC基础-面向对象语法_第5张图片

 

3.       带多个参数的方法

u  设计一个计算和的方法

// 方法声明

- (double)sumOfNum1:(double)num1andNum2:(double)num2;

//方法实现

- (double)sumOfNum1:(double)num1andNum2:(double)num2

{

    return num1 + num2;

}

黑马程序员-IOS-OC基础-面向对象语法_第6张图片

u  方法调用

黑马程序员-IOS-OC基础-面向对象语法_第7张图片


4.       方法名注意

l  冒号也是方法名的一部分

l  同一个类中不允许两个对象方法同名



-------------------------------------- android培训java培训、ios培训期待与您交流! ---------------------------------




你可能感兴趣的:(黑马程序员-IOS-OC基础-面向对象语法)