oc面向对象

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值