时间:2017年04月28日星期五
说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com
教学示例源码:无
个人学习源码:https://github.com/zccodere/s...
第一章:开始面向对象之旅
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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。