oc面向对象
2015-09-16 00:48
489 查看
OC面向对象:
封装,继承,多态,类方法,以及弱语法!!
main.m:
Student.h
Student.m
Teacher.h
Teacher.m
Person.h
Person.m
JiSuanQI.h
JiSuanQI.m
Car.h
Car.m
QQCar.h
QQCar.m
封装,继承,多态,类方法,以及弱语法!!
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
相关文章推荐
- PostgreSQL教程(三):表的继承和分区表详解
- Lua编程示例(二):面向对象、metatable对表进行扩展
- C#中面向对象编程机制之多态学习笔记
- 浅谈Lua的面向对象特性
- Lua面向对象之类和继承浅析
- 浅析Ruby中继承和消息的相关知识
- JavaScript面向对象的两种书写方法以及差别
- 浅谈c# 面向对象之类与对象
- C#面向对象特征的具体实现及作用详解
- C# 面向对象的基本原则
- 设计引导--一个鸭子游戏引发的设计理念(多态,继承,抽象,接口,策略者模式)
- 浅谈对c# 面向对象的理解
- C++实现不能被继承的类实例分析
- Ruby面向对象编程详解
- php学习 面向对象 课件第1/2页
- PHP程序61条面向对象分析设计的经验小结
- 收集学习asp.net比较完整的面向对象开发流程
- javascript 面向对象编程 万物皆对象
- 不错的JavaScript面向对象的简单入门介绍第1/2页