您的位置:首页 > 移动开发 > Objective-C

oc面向对象

2015-09-16 00:48 489 查看
OC面向对象:

封装,继承,多态,类方法,以及弱语法!!

main.m:

<pre name="code" class="objc">//
//  main.m
//  oc-面向对象
//
//  Created by stevenchang on 9/14/15.
//  Copyright (c) 2015 cz. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Student.h"
#import "Teacher.h"
#import "Person.h"
#import "JiSuanQI.h"
#import "Dog.h"
#import "QQCar.h"

int main(int argc, const char * argv[]) {
/**
1.面向对象的封装特性:
作用:
对数据进行预处理;
避免外部对象随意调用属性,保证数据的安全性;
可以方便统一操作数据
*/

//创建一个Student对象
Student *stu = [[Student alloc] init];

//设置年龄
//private
[stu setAge:-2];
[stu setAge:3];

//设置体重
//public
stu->weight = 20;   //weight是public的,通过此种方式可以直接为weight赋值

//设置身高
[stu setHeight:-3.0];

NSLog(@"此时学生的年龄为:%d", stu.age);
NSLog(@"此时学生的年龄为:%d", [stu age]);

NSLog(@"此时学生的体重为%f",stu.weight);

NSLog(@"此时学生的身高为:%f", stu.height);

/**
OC 弱语法:
没有申明和实现的方法只是警告
oc中的方法是动态检测: 在运行过程中才会检测对象有没有实现相应的方法
*/
Person *person = [[Person alloc] init];
[person function];
//    [person hahah];    //在Xcode6.2中,如果类的声明中相应的函数的声明,编译器会自动进行提示说明
//    [person function1];   //没有声明,只有实现,运行时也会出错,编译和链接时只会出现警告
//[person function2];   //只有声明没有实现在,运行时会出现错误,编译和链接时只会出现警告

/*
* self的用法
* 1> self 指向当前调用者
* 2> self对象方法中,表示对象;在类方法中,表示类
* 3> self可以访问成员变量
*/
Teacher *tea = [[Teacher new] init];    //创建一个Teacher对象
[tea test];
[Teacher test];    //这是调用类方法
[tea test1];
[Teacher test2];

/**
类方法:
+ 表示是类方法
类方法不需要创建对象,类方法只能由类来调用[类名  方法名]
类方法中不能访问成员变量
类方法的执行效率比对象方法高,再oc开发中能用类方法尽量使用类方法
当方法中不需要使用成员变量时,改用类方法
*/
int total = [JiSuanQI countTotalNum1:2 addNum2:89];
int average = [JiSuanQI averageNumd1:2 andNum2:8];
NSLog(@"和为%d,平均值为%d",total, average);

/**
继承
避免重复代码,对于父类中的方法,可以直接使用
继承中我们还会经常使用一个关键字:super
super可以用于调用父类中的方法
super指向当前调用者的父类
- 在对象方法中,则调用父类中对应的对象方法;
+ 在类方法中,则调用父类中对应的类方法
*/
QQCar *qq = [QQCar new];    //创建一个QQ对象
[qq setPrice:23.4];
[qq setWheel:4];

//num1为public,num2为private
//可以发现,对于子类来说,可以直接访问父类中public的成员变量,
//不能访问private,protected的成员变量
//    qq->num1;
//    qq->num2;
//因此对于子类来说,子类不是能够完全使用父类的成员变量,但是可以完全使用方法
[QQCar test];    //此test是父类中的类方法,使用子类直接可以进行调用
NSLog(@"车子的价格为%f,轮子为%d",qq.price, qq.wheel);

/**
多态:  没有继承就没有多态,具有多种形态,例如:狗,既是狗也是动物
可以用一个父类指针变量指向多个子类对象
父类类型的变量是不能直接调用子类特有的方法,编译器会发生警告,必须强转为子类对象
*/
Dog *dog = [Dog new];
[dog eat];

//Dog也是Animal类型,这个时候是动态绑定aa指向的真实对象
Animal *ani = [Dog new];
[ani eat];
//使用强制类型转换对ani进行类型转换
Dog *d = (Dog *)ani;
[d eat];
return 0;
}





Student.h

//
//  Student.h
//  oc-面向对象
//
//  Created by stevenchang on 9/14/15.
//  Copyright (c) 2015 cz. All rights reserved.
//

//引用了Foundation.h框架
#import <Foundation/Foundation.h>

//类的声明
@interface Student : NSObject
{
int no;   //默认是protected,外界无法直接操纵属性
@public
float weight;
@private
int age;
@protected
//这里写类的属性,默认是@protect,需要提供setter和getter方法
double height;

}

//对象方法,- 开头(返回值类型)函数名:......
- (void)setAge:(int)newAge;     //函数的声明
- (int)age;       //函数的声明

- (float)weight;

- (void)setHeight:(double)newHeight;
- (double)height;

@end


Student.m

//
//  Student.m
//  oc-面向对象
//
//  Created by stevenchang on 9/14/15.
//  Copyright (c) 2015 cz. All rights reserved.
//

//引入头文件"Student.h"
#import "Student.h"

//类的实现
@implementation Student

- (void)setAge:(int)newAge {
if (newAge < 0) {   //数据的过滤,对于所有小于0的年龄,值均设为0
newAge = 0;
}
age = newAge;    //给age赋值
}

- (int)age {
//返回age的值
return age;
}

- (float)weight {
return weight;
}

- (void)setHeight:(double)newHeight {
if (newHeight < 0) {
newHeight = 0;
}
height = newHeight;
}

- (double)height {
return height;
}

@end


Teacher.h

//
//  Teacher.h
//  oc-面向对象
//
//  Created by stevenchang on 9/15/15.
//  Copyright (c) 2015 cz. All rights reserved.
//

//import引用Foundation
#import <Foundation/Foundation.h>

//声明teacher : 表示继承
@interface Teacher : NSObject

//这里演示的都是self的用法
- (void)test;    //声明一个test方法
+ (void)test;      //声明一个test类方法,类方法可以与对象方法同名

- (void)test1;    //声明一个test1对象方法
+ (void)test2;   //声明一个test2类方法
@end


Teacher.m

//
//  Teacher.m
//  oc-面向对象
//
//  Created by stevenchang on 9/15/15.
//  Copyright (c) 2015 cz. All rights reserved.
//

#import "Teacher.h"

@implementation Teacher

- (void)test {
NSLog(@"调用了对象方法test");
}

+ (void)test {
NSLog(@"调用了类方法test");
}

- (void)test1 {
[self test];
NSLog(@"调用了对象方法test1");
}

+ (void)test2 {
[self test];
NSLog(@"调用了类方法test2");
}

@end


Person.h

//
//  Person.h
//  oc-面向对象
//
//  Created by stevenchang on 9/16/15.
//  Copyright (c) 2015 cz. All rights reserved.
//

//import 引用Foundation
#import <Foundation/Foundation.h>

//声明一个Person类   : 表示继承
@interface Person : NSObject

- (void)function;    //声明一个函数

- (void)function2;

@end


Person.m

//
//  Person.m
//  oc-面向对象
//
//  Created by stevenchang on 9/16/15.
//  Copyright (c) 2015 cz. All rights reserved.
//

#import "Person.h"

@implementation Person

- (void)function {
NSLog(@"这是有声明和实现的方法");
}

- (void)function1 {
NSLog(@"这是一个没有声明的函数");
}
@end


JiSuanQI.h

//
//  JiSuanQI.h
//  oc-面向对象
//
//  Created by stevenchang on 9/16/15.
//  Copyright (c) 2015 cz. All rights reserved.
//
//Import 引用Foundation
#import <Foundation/Foundation.h>

//计算器类的声明  : 表示继承
@interface JiSuanQI : NSObject
{
int _num;
}
//计算和
+ (int)countTotalNum1:(int)num1 addNum2:(int)num2;
//计算平均值
+ (int)averageNumd1:(int)num1 andNum2:(int)num2;
@end


JiSuanQI.m

//
//  JiSuanQI.m
//  oc-面向对象
//
//  Created by stevenchang on 9/16/15.
//  Copyright (c) 2015 cz. All rights reserved.
//

#import "JiSuanQI.h"

@implementation JiSuanQI

+ (int)countTotalNum1:(int)num1 addNum2:(int)num2 {
return num1 + num2;
}

+ (int)averageNumd1:(int)num1 andNum2:(int)num2 {
//    NSLog(@"%d",self->_num);   类方法中不能访问成员变量
int total = [self countTotalNum1:num1 addNum2:num2];
return total / 2;
}

@end


Car.h

//
//  Car.h
//  oc-面向对象
//
//  Created by stevenchang on 9/16/15.
//  Copyright (c) 2015 cz. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Car : NSObject
{
//设置属性
int _wheel;
double _price;
@public
int num1;
@private
int num2;
}

- (void)setWheel:(int)wheel;     //设置轮子
- (int)wheel;       //获取轮子个数

- (void)setPrice:(double)price;     //设置价格
- (double)price;      //获取价格

+ (void)test;

@end


Car.m

//
//  Car.m
//  oc-面向对象
//
//  Created by stevenchang on 9/16/15.
//  Copyright (c) 2015 cz. All rights reserved.
//

#import "Car.h"

@implementation Car

- (void)setWheel:(int)wheel {
_wheel = wheel;
}

- (int)wheel {
return _wheel;
}

- (void)setPrice:(double)price {
_price = price;
}

- (double)price {
return _price;
}

+ (void)test {
NSLog(@"test 方法。。。。。。");
}

@end


QQCar.h

//
//  QQCar.h
//  oc-面向对象
//
//  Created by stevenchang on 9/16/15.
//  Copyright (c) 2015 cz. All rights reserved.
//

#import "Car.h"

//QQCar导入了继承了Car : 表示继承
@interface QQCar : Car

@end


QQCar.m

//
//  QQCar.m
//  oc-面向对象
//
//  Created by stevenchang on 9/16/15.
//  Copyright (c) 2015 cz. All rights reserved.
//

#import "QQCar.h"

@implementation QQCar

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息