黑马程序员 -- OC语言 基本语法 类 对象

第一讲 基本语法 类 对象

A.语法概述

1.Object-C在C语言的基础上延伸而来的,面向对象语言。完全兼容C语言。

2.基本上所有关键字是以@开头

3.OC中字符串以@开头,例如@”jack”;OC文件的文件类型是.m

4.语言的注释和C语言的注释相同。

5.OC语言的开发过程是:


6.兼容C语言可以这样写:

//这样写在编译环境中可以完全通过。

#include <stdio.h>

Int main()

{

Printf(“nishiwo”);

Return 0;

}

//OC语言的写法。

#import <Foundation/NSObjCRuntime.h>

Int main()

{

//NSLog输出内容会自动换行

NSLog(@”第二个OC程序!!”);

Return 0;

}


//主函数若想调用其他文件下的函数,在主函数或者要要使用的文件下,必须包含函数的声明,函数的声明一般建立在函数同名的.h文件中。这样在主函数和需要调用的函数中,#import该文件(.h)就可。

//OC语言和C语言在同一个环境中可以混合使用。

#import<Foundation/NSObjCRuntime.h>

#import<stdio.h>

Int main()

{

NSLog(@”OC可以混合写”);

Printf(“C中写”);

}


7.BOOL类型

//OC语言中的布尔类型是YES NO

Int main()

{

BOOL b = YES;

BOOL b1 = NO;

BOOL b2 = 1;

BOOL b3 = 0;

NSLog(@”%i”, b);//b的输出为1

}

//也可以用作函数的返回类型,BOOL的本质是char类型。Typrdefsigned char BOOL

BOOL age();

B.OC设计思想

1.OC是面向对象的,C是面向过程的。面向对象和面向过程只是解决问题的两种不同选择。

面向过程思考的是每个实现的步骤。面向对象思考的是解决问题需要哪些对象。

2.OC中创建对象,必须了解什么是类。类中包含对象的属性和行为。


//类是对相同属性的共同描述和概括,抽象出来的。也就是说要想创建对象,必须先有类。

OC利用类来创建对象,对象是类的具体存在。因此,面向对象解决问题应该是先考虑需要设计哪些类,再利用类来创建多少个对象。

3.如何设计类

a.类的设计,只关心3样东西

//事物名称(类名):人(Person)

//属性:身高(height)、年龄(age)

//行为:跑(run)、打架(fight)

b.一般名词都是类。

c.拥有相同(或者类试)属性和行为的对象都可以抽象出来一个类。

4.类的设计

a.类的设计包含:类名、属性、行为。

//类名:

类名的第一个字母必须大写、不能有下划线、多个英文单词用驼峰标示。

b.类的建立包含声明和实现

//类的声明

@interface 类名 :继承其他类(类名)

{

//声明中描述两个属性

}

//在这里放置方法的声明

@end

//因为使用了NSObject这个类,需要包含此类声明的.h文件。#import<Foundation/Foundation .h>

//:NSObject目的是:让Car这个类具备创建对象的能力。

@interface Car :NSObject

{

//声明中描述两个属性

Int wheels;

Int speed;

}

//在这里放置方法的声明

@end

//类的实现

@Implementation 类名

@end

//主函数中

Int main()

{

//在OC中,向执行一些行为,就写上一个中括号[](行为执行者行为名称);

//利用类来创建对象

//执行了Car这个类的new行为来创建新对象

//对象创建出来以后,就拥有了自己的两个成员变量(wheels、speed),并且会初始化为0。

[Car new];

Return 0;

}

//执行完创建对象后,在内存中的分配情况


5.成员变量的直接赋值

//[Car new];创建的对象,返回的是一个指针(对象本身),并且是Car类型的指针,所以类型也是Car类型。

Car *p = [Car new];

//对象创建完以后,在内存中的存储细节是:

//OC对象本身的本质就是结构体


//访问类中的变量,对成员变量(实例变量)赋值。

//默认创建下,成员变量时受保护的。要想访问成员变量,必须加上@public,让成员变量成为公有的。

//声明中描述两个属性

{

@public

Int wheels;

Int speed;

}

p->wheels = 4;

p->speed = 250;

//再次创建第二个对象时,在内存中会有第二个分配的内存块。

Car *p 2= [Car new];

P2->wheels = 4;

P2->speed = 250;


6.对象的行为

a.写行为(方法)的时候,在声明中必须写在大括号的外面,并且在@interface 和@end的里面。

//方法的声明

@interface Car :NSObject

{

//声明中描述两个属性

Int wheels;

Int speed;

}

//在这里放置方法的声明

//方法(行为):方法名、参数、返回值(声明、实现)

//函数声明用 void run();而OC对象的方法是 – (void)run;

//OC中的小括号,必须括住数据类型。

-(void)run;

@end

//方法的实现

@Implementation  Car

-(void)run

{

NSLog(@”车子再跑”);

}

@end

//在主函数OC中,向执行一些行为,就写上一个中括号[](行为执行者行为名称);

方法的调用可以这样写:

[p run]; //调用这个函数后,程序会到类的实现中去找这个方法,找到后运行方法。

//类方法的声明、方法的实现


7.成员变量的使用

a.定义一个新的对象,并且存储原来对象的地址,在运用成员变量的时候,将会改变原来成员变量的值


//第二种使用区别,OC里面的对象内存,不可能自动回收的。


//在每个创建的类对象中,分配的内存中都有一个ISA指针,这个指针指向的是类的内存块中的地址,所以创建的类的对象,都是原类的副本,执行的程序都是要运行原类的方法。


8.OC对象和函数的注意点

//对象

a.对象方法都是以-(减号)号开头

b.对象方法的声明必须写在@interface和@end之间

c.对象方法的实现必须写在@implemention和@end之间

d.对象方法只能由对象进行调用

e.对象归类、对象所有

//函数

a.函数能写在文件中的任意位置,函数归文件所有

b.函数调用不依赖于对象

c.函数内部不能直接通过成员变量名访问某个对象的成员变量


//C对象的指针,没有发生改变。所以输出的值还是4和250


9.类的合理设计

a.设计一个学生类

//成员变量:性别、生日、体重、颜色、狗

//方法(行为):吃、跑、遛狗、喂狗

#import<Foundation/Foundation.h>

Typedef enum  {

SexMan,

SexWoman

}Sex;

Typedef enum {

ColorBlack,

ColorRed,

ColorGreen

}Color;

Typedef struct {

 

Int year;

Int month;

Int day

}Date;

@interface       Student:NSObject

{

Sex sex;

Date birthday;

Double weight;

Color favColor;

}

-(void)eat;

-(void)run;

@end

 

@implemention Student

-(void)eat

{

 

}

-(void)run

{

 

}

@end

Int main()

{

}


10.类套类的实现(这是真正的面向对象)

//紧接着9中的类设计,加入Dog的类

@interface Dog :NSObject

{

Double weight;

Color curColor;

}

-(void)run;

-(void)eat;

@end

@implemention Dog

-(void)run;

-(void)eat;

@end

//在学生类中加入Dog这个对象。

@interface       Student:NSObject

{

Sex sex;

Date birthday;

Double weight;

Color favColor;

//重点学习部分

Dog *dog;

}

Int main()

{

Student *stu =[Student new];            

//学生体重

Stu->weight = 50;

//学生性别

Stu->sex = SexMan;

//学生生日

Date d = {2015,02,23};

Stu->birthday = d;

//学生姓名

Stu->name = “jack”;

//dog类的访问

Stu->dog = [Dog new];

[stu liuGou];

Return 0;

}

11.类的声明和实现,带有参数


//类的声明

@interface jishuqi :NSObject

{

}

-(double)pi;

//带有参数的方法,OC方法中,一个参数对应一个冒号

-(int)pingFang:(int)num;

-(int)sumAdd:(int)num1 andNum:(int)num2;

@end

//类的实现

@implementtion jishuqi

-(double)pi;

{

Return 3.14;

}

-(int)pingFang:(int)num

{

Return num * num;

}

-(int)sumAdd:(int)num1 andNum:(int)num2

{

Return  num1 + num2;

}

@end

//在主函数中

{

Jishuqi *jsq = [jishuqi new];

Int a = [jsq sumAdd:10 andNum:5];

NSLog(@”%d”, a)

Return 0;

}


12.类的设计练习

//设计一个方法,用来和其他车比较车速,返回车速的差值

@interface Car:NSObject

{

@public

Int speed;

}

-(int)compareSpeedWithOther:(Car *)other;

@end

@implemention Car

-(int)compareSpeedWithOther:(Car *)other

{

//speed这个访问的是当前类中的速度。Other->speed访问的是传递过来的速度

Return speed – other->speed;

}

@end

Int main()

{

Car *c1 = [Car new];

C1->speed = 300;

Car *c2 = [Car new];

C2->speed = 200;

 

Int a = [c1 compareSpeedWithother:c2];//c1= 300,c2 = 200;

NSLog(@”%d”, a);

Return 0;

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值