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