慕课网_《Objective-C面向对象初体验》学习总结

浏览: 65 发布日期: 2017-05-10 分类: objective-c

时间:2017年04月28日星期五
说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com
教学示例源码:无
个人学习源码:无

第一章:开始面向对象之旅

1-1 OOP简介

什么是面向对象
OOP面向对象编程(Object Oriented Programming)

OOA面向对象分析
OOD面向对象设计

OOP基本概念

对象
抽象 – 类

示意图

抽象化:由对象变为类;对象化:由类变为对象。

1-2 C++和OC对比

第二章:类和对象的关系

2-1 OC创建类和对象

类和对象的基本概念

创建类、得到对象。从类到对象的过程称为实例化

代码演示:

2-2 OC属性和成员变量(上)

成员变量的声明和使用

属性的声明和使用

示意图

代码演示:

2-3 OC属性和成员变量(下)

成员变量是给类内使用的,声明在.m文件中

属性变量时给类外使用的,声明在.h文件中

完整代码演示:

1、People类声明

//
//  People.h
//  Class1
//
//  Created by zc on 2017/4/28.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

// 类内使用成员变量、类外使用属性
// 姓名、年龄、性别
#import <Foundation/Foundation.h>

@interface People : NSObject
/*
{    
    NSString *_peopleName;
    int _peopleAge;
    int _peopleSex;
}
*/
// 为了让类外可以访问成员变量
// 属性就是成员变量的外部接口
@property(nonatomic,strong)NSString *peopleName;

//- (void)setName:(NSString *)name;
//- (NSString *)getName;
@end

2、People类实现

//
//  People.m
//  Class1
//
//  Created by zc on 2017/4/28.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

#import "People.h"

@implementation People
{
    int _peopleAge;
    int _peopleSex;
}

- (instancetype) init{
    self = [super init];
    if(self){
        // 类内调用成员变量而不是属性,属性是给类外使用的
        _peopleName = @"张三";
    }
    return self;
}

/*
- (void)setName:(NSString *)name{
    _peopleName = name;
}
- (NSString *)getName{
    return _peopleName;
}
*/
@end

3、main类

//
//  main.m
//  Class1
//
//  Created by zc on 2017/4/28.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

#import <Foundation/Foundation.h>
// 导入类的声明
#import "People.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        // 实例化对象,*代表指针,即在OC中,所有对象都是指针。
        /*
         [类名 方法名]
         [对象名 方法名]
         alloc 为对象分配内存空间
         init 进行初始化操作
         */
        People *p1 = [[People alloc] init];
        People *p2 = [[People alloc] init];

        People *p3 = [People new];//不建议使用
        
        NSLog(@"p1 : %p",p1);
        NSLog(@"p2 : %p",p2);
        NSLog(@"p3 : %p",p3);
        
        p1.peopleName =  @"张三";
        p2.peopleName =  @"李四";
        NSLog(@"people name : %@",p1.peopleName);
        NSLog(@"people name : %@",p2.peopleName);
    }
    return 0;
}

第三章:类的函数

3-1 OC函数(上)

示意图:

3-2 OC函数(中)

声明方法

1、- + 方法的类型
    - 代表对象方法,用对象名来调用
    + 代表类方法,用来来调用
    加号方法和减号方法可以互相调用,当然需要类名和实例化对象。
    加号方法不能调用成员变量,可以调用静态成员变量。
 2、(void) 返回值类型
 
 3、参数
    :(int)x 代表有参数,(int)代表参数类型,x代表参数名称
 4、方法名
    去掉方法类型、去掉参数类型、去掉参数名称,剩下的就是方法名

3-3 OC函数(下)

OC初始化方法,类型Java的构造方法

完整代码演示:

1、People类声明

//
//  People.h
//  MethodDemo
//
//  Created by zc on 2017/4/28.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface People : NSObject

/*
 声明方法
 1、- + 方法的类型
    - 代表对象方法,用对象名来调用
    + 代表类方法,用来来调用
    加号方法和减号方法可以互相调用,当然需要类名和实例化对象。
    加号方法不能调用成员变量,可以调用静态成员变量。
 2、(void) 返回值类型
 
 3、参数
    :(int)x 代表有参数,(int)代表参数类型,x代表参数名称
 4、方法名
    去掉方法类型、去掉参数类型、去掉参数名称,剩下的就是方法名
 */

- (void)report;
/*
+ (void)report1;

- (int)showWithA:(int)a;

// showWithA: andB:
- (int)showWithA:(int)a andB:(int)b;
*/


// 初始化方法
- (instancetype)init;//重写init方法
// 自定义初始化方法
- (instancetype)initWithPeopleName:(NSString *)
peopleName andPeopleAge:(int)peopleAge;


@end

2、People类实现

//
//  People.m
//  MethodDemo
//
//  Created by zc on 2017/4/28.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

#import "People.h"

@implementation People
{
    // 成员变量
    NSString *_peopleName;
    int _peopleAge;
}

// 静态成员变量
static NSString *_peopleName1;

- (void)report{
//    NSLog(@"-号:report");
//    //[People report1];
//    _peopleName = @"123";
    NSLog(@"peopleName = %@",_peopleName);
    NSLog(@"peopleName = %d",_peopleAge);


}

+ (void)report1{
    NSLog(@"+号:report1");
    [[People alloc] report];
    _peopleName1 = @"张三";
}

- (int)showWithA:(int)a{
    return a;
}

- (int)showWithA:(int)a andB:(int)b{
    return a+b;
}

// 重写初始化方法
- (instancetype)init
{
    self = [super init];
    if (self) {
        _peopleName = @"Visitor";
        _peopleAge = 30;
    }
    return self;
}

- (instancetype)initWithPeopleName:(NSString *)
peopleName andPeopleAge:(int)peopleAge{
    self = [super init];
    if(self){
        _peopleName = peopleName;
        _peopleAge = peopleAge;
    }
    return self;
}


@end

3、main类

//
//  main.m
//  MethodDemo
//
//  Created by zc on 2017/4/28.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "People.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        // [] 代表调用方法,调用方法使用 []
        People *p1 = [[People alloc] init];
        
//        [p1 report];
        
//        [People report1];
//        
//        int a1 = [p1 showWithA:10];
//        NSLog(@"a1 = %d",a1);
//        
//        int a2 = [p1 showWithA:10 andB:20];
//        NSLog(@"a2 = %d",a2);
        
        [p1 report];
        
        People *p2 = [[People alloc] initWithPeopleName:@"张三" andPeopleAge:20];
        People *p3 = [[People alloc] initWithPeopleName:@"李四" andPeopleAge:30];

        [p2 report];
        [p3 report];
        
    }
    return 0;
}

第四章:面向对象三部曲

4-1 OC面向对象之封装(上)

什么是封装

隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。

封装的好处

1、将事物进行更加抽象,使用起来更加方便
2、对访问的控制,达到更好的效果

4-2 OC面向对象之封装(下)

访问控制修饰符

@public      类内类外可使用,可继承,指方法调用(->)
@protected   类内使用,可继承
@private     类内使用,不可继承
@package     框架权限,框架内相当于受保护,框架外相当于私有

完整代码演示:

1、MyClass类声明

//
//  MyClass.h
//  PackDemo
//
//  Created by zc on 2017/4/28.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface MyClass : NSObject
{
    // 成员变量访问修饰符的问题
    
    // 默认为受保护
    
    // 公有:在类内类外都可以使用并且可以被继承
    @public
    int _classInt;
    
    // 私有:在类内可以使用,类外无法调用并且不可以被继承
    @private
    
    // 受保护:默认:在类内可以使用,类外无法调用并且可以被继承
    @protected
    NSString *_classStr;
    
    // 框架权限:在框架内相当于受保护,在框架外相当于私有
    @package
    
}
@property(nonatomic,strong)NSString *className;

// 方法是没有修饰符的,同C语言一样
- (void)report;

@end

2、MyClass类实现

//
//  MyClass.m
//  PackDemo
//
//  Created by zc on 2017/4/28.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

#import "MyClass.h"

@implementation MyClass


- (void)report{
    _classStr = @"234";
    NSLog(@"ClassName : %@",_className);
    NSLog(@"ClassName : %d",_classInt);
}

@end

3、main类

//
//  main.m
//  PackDemo
//
//  Created by zc on 2017/4/28.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "MyClass.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        MyClass *mc = [[MyClass alloc] init];
        
        mc.className = @"我的类";
        
        [mc report];
        // 使用指向来调用类中的公有成员变量
        mc->_classInt = 1001;
        
        [mc report];
        
        
    }
    return 0;
}

4-3 OC面向对象之继承(上)

什么是继承,子类继承父类。
什么是多继承,很多父类继承,OC中没有多继承。

4-4 OC面向对象之继承(下)

父类中的方法没有写声明则子类无法继承父类中对应的方法。

完整代码演示:

1、MyClass类声明

//
//  MyClass.h
//  ExtendDemo
//
//  Created by zc on 2017/4/28.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

#import <Foundation/Foundation.h>

//  NSObject:基类
@interface MyClass : NSObject
{
    // 访问修饰符默认是受保护
    @protected
    int _classInt;
    
    // 私有
    @private
    NSString *_classString;
}
@property(nonatomic,strong)NSString *className;

-(void)report;

@end

2、MyClass类实现

//
//  MyClass.m
//  ExtendDemo
//
//  Created by zc on 2017/4/28.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

#import "MyClass.h"

@implementation MyClass

- (void)report{
    _classInt = 1001;
    _classString = @"MyClassStr";
    NSLog(@"ClassName : %@",_className);
    NSLog(@"ClassInt : %d",_classInt);
    NSLog(@"ClassString : %@",_classString);
}

@end

3、MySubClass类声明

//
//  MySubClass.h
//  ExtendDemo
//
//  Created by zc on 2017/4/28.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

// 引用父类头文件
#import "MyClass.h"

// interface时候,冒号(:)代表继承关系
@interface MySubClass : MyClass

- (void)show;

@end

4、MySubClass类实现

//
//  MySubClass.m
//  ExtendDemo
//
//  Created by zc on 2017/4/28.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

#import "MySubClass.h"

@implementation MySubClass

- (void)show{
    _classInt = 1002;
    // 父类中的私有变量我们是无法继承使用的
    //_classString = @"fdsf";
    NSLog(@"show : %d",_classInt);
    
    // 如果父类中的方法没有写声明则子类无法继承父类中对应的方法
    [self report];
}

@end

5、main类

//
//  main.m
//  ExtendDemo
//
//  Created by zc on 2017/4/28.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "MyClass.h"
#import "MySubClass.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        // 父类
        MyClass *mc = [[MyClass alloc] init];
        mc.className = @"MyClass";
        [mc report];
        
        // 子类
        MySubClass *msc = [[MySubClass alloc] init];
        msc.className = @"MySubClass";
        [msc report];
        [msc show];
    }
    return 0;
}

4-5 OC面向对象之多态

多态的基本概念

同一个父类多个子类不同的形态叫多态。
方法重写和方法重载是多态的必要手段。
OC中不支持方法重载。

完整代码演示:

1、Printer类声明

//
//  Printer.h
//  DuoTaiDemo
//
//  Created by zc on 2017/5/10.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

#import <Cocoa/Cocoa.h>

@interface Printer : NSObject

- (void)print;

@end

2、Printer类实现

//
//  Printer.m
//  DuoTaiDemo
//
//  Created by zc on 2017/5/10.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

#import "Printer.h"

@implementation Printer

- (void)print{
    NSLog(@"我是打印机");
}

@end

3、ColorPrinter类声明

//
//  ColorPrinter.h
//  DuoTaiDemo
//
//  Created by zc on 2017/5/10.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

#import "Printer.h"

@interface ColorPrinter : Printer

@end

4、ColorPrinter类实现

//
//  ColorPrinter.m
//  DuoTaiDemo
//
//  Created by zc on 2017/5/10.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

#import "ColorPrinter.h"

@implementation ColorPrinter

// 方法重写
- (void)print{
    NSLog(@"彩色打印机");
}

@end

5、BlackPrinter类声明

//
//  BlackPrinter.h
//  DuoTaiDemo
//
//  Created by zc on 2017/5/10.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

#import "Printer.h"

@interface BlackPrinter : Printer

@end

6、ColorPrinter类实现

//
//  BlackPrinter.m
//  DuoTaiDemo
//
//  Created by zc on 2017/5/10.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

#import "BlackPrinter.h"

@implementation BlackPrinter

// 方法重写
- (void)print{
    
    // 调用父类方法
    [super print];
    
    // 调用当前类方法
    //[self print];
    
    NSLog(@"黑白打印机");
}

@end

7、main类

//
//  main.m
//  DuoTaiDemo
//
//  Created by zc on 2017/5/10.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "ColorPrinter.h"
#import "BlackPrinter.h"


int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        ColorPrinter *cp = [[ColorPrinter alloc] init];
        
        BlackPrinter *bp = [[BlackPrinter alloc] init];
        
        [cp print];
        
        [bp print];
        
        Printer *printer = [[ColorPrinter alloc] init];
        [printer print];
        
    }
    return 0;
}
返回顶部