慕課網_《Objective-C面向對象初體驗》學習總結

時間:2017年04月28日星期五
說明:本文部份內容均來自慕課網。@慕課網:http://www.imooc.com
教學示例源碼:無
我的學習源碼:https://github.com/zccodere/s...ios

第一章:開始面向對象之旅

1-1 OOP簡介

什麼是面向對象
OOP面向對象編程(Object Oriented Programming)git

OOA面向對象分析
OOD面向對象設計

OOP基本概念github

對象
抽象 – 類

示意圖編程

clipboard.png

clipboard.png

抽象化:由對象變爲類;對象化:由類變爲對象。框架

clipboard.png

1-2 C++和OC對比

clipboard.png

clipboard.png

第二章:類和對象的關係

2-1 OC建立類和對象

類和對象的基本概念函數

建立類、獲得對象。從類到對象的過程稱爲實例化

代碼演示:學習

clipboard.png

clipboard.png

2-2 OC屬性和成員變量(上)

成員變量的聲明和使用atom

屬性的聲明和使用spa

示意圖設計

clipboard.png

代碼演示:

clipboard.png

2-3 OC屬性和成員變量(下)

成員變量是給類內使用的,聲明在.m文件中

屬性變量時給類外使用的,聲明在.h文件中

完整代碼演示:

一、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

二、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

三、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函數(上)

示意圖:

clipboard.png

3-2 OC函數(中)

聲明方法

一、- + 方法的類型
    - 表明對象方法,用對象名來調用
    + 表明類方法,用來來調用
    加號方法和減號方法能夠互相調用,固然須要類名和實例化對象。
    加號方法不能調用成員變量,能夠調用靜態成員變量。
 二、(void) 返回值類型
 
 三、參數
    :(int)x 表明有參數,(int)表明參數類型,x表明參數名稱
 四、方法名
    去掉方法類型、去掉參數類型、去掉參數名稱,剩下的就是方法名

3-3 OC函數(下)

OC初始化方法,類型Java的構造方法

完整代碼演示:

一、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

/*
 聲明方法
 一、- + 方法的類型
    - 表明對象方法,用對象名來調用
    + 表明類方法,用來來調用
    加號方法和減號方法能夠互相調用,固然須要類名和實例化對象。
    加號方法不能調用成員變量,能夠調用靜態成員變量。
 二、(void) 返回值類型
 
 三、參數
    :(int)x 表明有參數,(int)表明參數類型,x表明參數名稱
 四、方法名
    去掉方法類型、去掉參數類型、去掉參數名稱,剩下的就是方法名
 */

- (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

二、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

三、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面向對象之封裝(上)

什麼是封裝

隱藏對象的屬性和實現細節,僅對外公開接口,控制在程序中屬性的讀取和修改的訪問級別。

封裝的好處

一、將事物進行更加抽象,使用起來更加方便
二、對訪問的控制,達到更好的效果

4-2 OC面向對象之封裝(下)

訪問控制修飾符

@public      類內類外可以使用,可繼承,指方法調用(->)
@protected   類內使用,可繼承
@private     類內使用,不可繼承
@package     框架權限,框架內至關於受保護,框架外至關於私有

完整代碼演示:

一、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

二、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

三、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面向對象之繼承(下)

父類中的方法沒有寫聲明則子類沒法繼承父類中對應的方法。

完整代碼演示:

一、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

二、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

三、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

四、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

五、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中不支持方法重載。

完整代碼演示:

一、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

二、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

三、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

四、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

五、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

六、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

七、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;
}
相關文章
相關標籤/搜索