OC学习过程中的一些总结
2015-11-06 21:06
253 查看
setter存在的意义:
作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值
成员变量: int _age设置set方法
- (void)setAge :(int)age;参数类型和setAge之间空一格,(int)和age之间空一格
- (void) setAge : (int) age ;
setter:
1.数据安全性
2.数据过滤
getter方法:
获取成员变量
必须有返回值,返回值类型和成员变量类型一致
没有参数
点语法一般给成员变量赋值,如果不是给成员变量赋值,一般不建议使用,但是也可以使用
成员变量 int _age 的getter
- (int) age;
点语法:
点语法是相对于setter和getter来说的
当点语法使用在 “=“赋值符号左侧的时候,点语法会被展开为setter方法的调用,其他情况(等号右侧、直接使用)为点语法展开为getter方法的调用
点语法的本质就是调用setter和getter,点语法的本质是方法调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相应的方法进行调用,
如果没有setter和getter,则不能使用点语法
不要在setter和getter中使用本属性的点语法
}
self在类方法中的表现:
在类方法中可以通过self来调用本类中的其他的类方法
不能在类方法中去调用对象方法或访问成员变量,因为对象方法与成员变量都是属于具体的实例对象的。
self在对象方法中的表现:
在对象方法中,可以通过self来调用本对象上的其他方法
在对象方法中,可以通过self来访问成员变量,不能用self调用本类的类方法
上面两个的代码体现
+ (void)carameWithFlahlightStatus:(FlahlightStatus)status//这是一个类方法,所以,能调用这个函数的只能是一个类,所以下面的self只能代表类,后面之所以openFlahlight方法和closeFlahlight方法都是类方法,就一目了然了,如果是对象方法的话,就违背了
//不能在类方法中去调用对象方法或访问成员变量,因为对象方法与成员变量都是属于具体的实例对象的。
{
if (status ==kFlahlightStatusOpen)
{
// [Iphone openFlahlight];
//其实在类方法中调用类方法除了可以使用类名调用以外,还可以使用self来调用
[selfopenFlahlight];
}else
{
// [Iphone closeFlahlight];
// self == Iphone
[selfcloseFlahlight];
}
NSLog(@"拍照");
}
+ (void)openFlahlight
{
NSLog(@"打开闪光灯");
}
+ (void)closeFlahlight
{
NSLog(@"关闭闪光灯");
}
全局变量,成员变量,局部变量
如果在— 对象方法中出现与成员变量同名的局部变量,如果此时想使用该成员变量可以通过self->成员变量名的方式
self和函数没关系,只和方法能产生关系
self只能在方法中使用;不要使用self来调用函数,也不可以在函数内部使用self;
使用self调用本方法,产生死循环
+ (void)openFlahlight
{
NSLog(@"打开闪光灯");
// NSLog(@"self = %p", self);
// 死循环
[selfopenFlahlight];//
死循环
}
self的使用场景
使用场景:
可以用于在对象方法之间进行相互调用
可以用于在类方法之间进行相互调用
可以用于区分成员变量和局部变量同名的情况,用self->访问的就是成员变量,而不是局部变量
继承
基类的私有属性能被继承,不能在子类中访问
OC中的继承是单继承
子类父类方法重名,子类可以重写方法,调用的时候是使用子类的方法,如果想使用父类的方法,用super关键字
子类不能重复定义父类已经存在的成员变量,即使是父类私有的,子类私有的也不可以
super在类方法中,就会调用父类的类方法;在对象方法中就会调用父类的对象方法
多态(多态中必须要有继承)
很多动物都需要人来喂养,人类中不可能定义太多的真多不同动物的方法来接收动物,并且完成喂养的动作,这样,在人类里面直接定义动物类来接收,注意:
想要这个动物类能接收具体的动物,那么这些具体的动物都要继承动物类
代码:
主函数:
#import<Foundation/Foundation.h>
#import "Dog.h"
#import "Cat.h"
#import "Animal.h"
#import "Person.h"
#import "Pig.h"
int main(int
argc, constchar
* argv[]) {
Dog *d = [Dognew];
Cat *c = [Catnew];
Pig *p = [Pignew];//创建三个对象
[Personfood:d];
[Personfood:c];
[Personfood:p];//人类调用类方法food,传入三个对象
return0;
}
Person.h
// Person.h
// day13
//
// Created by xiaomage on 15/6/19.
// Copyright (c) 2015年
xiaomage. All rights reserved.
//
#import<Foundation/Foundation.h>
#import "Dog.h"
#import "Cat.h"
@interface Person :NSObject
/*
+ (void)food:(Dog *)dog;
+ (void)foodCat:(Cat *)cat;
// 骆驼
// 狗熊
// 豹子
// 大象
// 猴子
// 鸡
// 猪
// 草泥马
// ...
*/
+ (void)food:(Animal
*)a;//只写一个方法,别的动物可以直接往里面塞了
@end
// Person.m
// day13
//
// Created by xiaomage on 15/6/19.
// Copyright (c) 2015年
xiaomage. All rights reserved.
//
#import"Person.h"
@implementation Person
+ (void)food:(Animal
*)a
{
[a eat];
}
@end
// Pig.h
// day13
//
// Created by xiaomage on 15/6/19.
// Copyright (c) 2015年
xiaomage. All rights reserved.
//
#import<Foundation/Foundation.h>
#import "Animal.h"
@interface Pig :Animal
@end
// Pig.m
// day13
//
// Created by xiaomage on 15/6/19.
// Copyright (c) 2015年
xiaomage. All rights reserved.
//
#import"Pig.h"
@implementation Pig
- (void)eat
{
NSLog(@"大口吃");
}
@end
注意:
Animal *a1 = [Dog new];
[a1 eat];//调用的是父类特有的方法
// 注意点:在多态中,如果想调用子类特有的方法必须强制类型转换为子类才能调用
// [a1 kanJia];
Dog *d1 = (Dog *)a1;//强制类型转换
[d1 kanJia];//这样就可以调用狗特有的方法
注意:
在多态中,父类可以访问子类特有的方法———— 强制类型转换
[(Dog*)an2 bark]; //把父类的指针,强制类型转换
*如果不存在多态,也就是说父类子类之间没有继承关系,是不能这么操作的
实例变量的修饰符
1)@public (公开的)在有对象的前
作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值
成员变量: int _age设置set方法
- (void)setAge :(int)age;参数类型和setAge之间空一格,(int)和age之间空一格
- (void) setAge : (int) age ;
setter:
1.数据安全性
2.数据过滤
getter方法:
获取成员变量
必须有返回值,返回值类型和成员变量类型一致
没有参数
点语法一般给成员变量赋值,如果不是给成员变量赋值,一般不建议使用,但是也可以使用
成员变量 int _age 的getter
- (int) age;
点语法:
点语法是相对于setter和getter来说的
当点语法使用在 “=“赋值符号左侧的时候,点语法会被展开为setter方法的调用,其他情况(等号右侧、直接使用)为点语法展开为getter方法的调用
点语法的本质就是调用setter和getter,点语法的本质是方法调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相应的方法进行调用,
如果没有setter和getter,则不能使用点语法
不要在setter和getter中使用本属性的点语法
- (void) setAge:(int)age { // 下面的代码会引发死循环 self.age = age; //编译器展开后 [self setAge:age] } - (int) age { // 下面的代码会引发死循环 return self.age; // 编译器展开后 [self age]
}
self在类方法中的表现:
在类方法中可以通过self来调用本类中的其他的类方法
不能在类方法中去调用对象方法或访问成员变量,因为对象方法与成员变量都是属于具体的实例对象的。
self在对象方法中的表现:
在对象方法中,可以通过self来调用本对象上的其他方法
在对象方法中,可以通过self来访问成员变量,不能用self调用本类的类方法
上面两个的代码体现
+ (void)carameWithFlahlightStatus:(FlahlightStatus)status//这是一个类方法,所以,能调用这个函数的只能是一个类,所以下面的self只能代表类,后面之所以openFlahlight方法和closeFlahlight方法都是类方法,就一目了然了,如果是对象方法的话,就违背了
//不能在类方法中去调用对象方法或访问成员变量,因为对象方法与成员变量都是属于具体的实例对象的。
{
if (status ==kFlahlightStatusOpen)
{
// [Iphone openFlahlight];
//其实在类方法中调用类方法除了可以使用类名调用以外,还可以使用self来调用
[selfopenFlahlight];
}else
{
// [Iphone closeFlahlight];
// self == Iphone
[selfcloseFlahlight];
}
NSLog(@"拍照");
}
+ (void)openFlahlight
{
NSLog(@"打开闪光灯");
}
+ (void)closeFlahlight
{
NSLog(@"关闭闪光灯");
}
全局变量,成员变量,局部变量
如果在— 对象方法中出现与成员变量同名的局部变量,如果此时想使用该成员变量可以通过self->成员变量名的方式
self和函数没关系,只和方法能产生关系
self只能在方法中使用;不要使用self来调用函数,也不可以在函数内部使用self;
使用self调用本方法,产生死循环
+ (void)openFlahlight
{
NSLog(@"打开闪光灯");
// NSLog(@"self = %p", self);
// 死循环
[selfopenFlahlight];//
死循环
}
self的使用场景
使用场景:
可以用于在对象方法之间进行相互调用
可以用于在类方法之间进行相互调用
可以用于区分成员变量和局部变量同名的情况,用self->访问的就是成员变量,而不是局部变量
继承
基类的私有属性能被继承,不能在子类中访问
OC中的继承是单继承
子类父类方法重名,子类可以重写方法,调用的时候是使用子类的方法,如果想使用父类的方法,用super关键字
子类不能重复定义父类已经存在的成员变量,即使是父类私有的,子类私有的也不可以
super在类方法中,就会调用父类的类方法;在对象方法中就会调用父类的对象方法
多态(多态中必须要有继承)
很多动物都需要人来喂养,人类中不可能定义太多的真多不同动物的方法来接收动物,并且完成喂养的动作,这样,在人类里面直接定义动物类来接收,注意:
想要这个动物类能接收具体的动物,那么这些具体的动物都要继承动物类
代码:
主函数:
#import<Foundation/Foundation.h>
#import "Dog.h"
#import "Cat.h"
#import "Animal.h"
#import "Person.h"
#import "Pig.h"
int main(int
argc, constchar
* argv[]) {
Dog *d = [Dognew];
Cat *c = [Catnew];
Pig *p = [Pignew];//创建三个对象
[Personfood:d];
[Personfood:c];
[Personfood:p];//人类调用类方法food,传入三个对象
return0;
}
Person.h
// Person.h
// day13
//
// Created by xiaomage on 15/6/19.
// Copyright (c) 2015年
xiaomage. All rights reserved.
//
#import<Foundation/Foundation.h>
#import "Dog.h"
#import "Cat.h"
@interface Person :NSObject
/*
+ (void)food:(Dog *)dog;
+ (void)foodCat:(Cat *)cat;
// 骆驼
// 狗熊
// 豹子
// 大象
// 猴子
// 鸡
// 猪
// 草泥马
// ...
*/
+ (void)food:(Animal
*)a;//只写一个方法,别的动物可以直接往里面塞了
@end
// Person.m
// day13
//
// Created by xiaomage on 15/6/19.
// Copyright (c) 2015年
xiaomage. All rights reserved.
//
#import"Person.h"
@implementation Person
+ (void)food:(Animal
*)a
{
[a eat];
}
@end
// Pig.h
// day13
//
// Created by xiaomage on 15/6/19.
// Copyright (c) 2015年
xiaomage. All rights reserved.
//
#import<Foundation/Foundation.h>
#import "Animal.h"
@interface Pig :Animal
@end
// Pig.m
// day13
//
// Created by xiaomage on 15/6/19.
// Copyright (c) 2015年
xiaomage. All rights reserved.
//
#import"Pig.h"
@implementation Pig
- (void)eat
{
NSLog(@"大口吃");
}
@end
注意:
Animal *a1 = [Dog new];
[a1 eat];//调用的是父类特有的方法
// 注意点:在多态中,如果想调用子类特有的方法必须强制类型转换为子类才能调用
// [a1 kanJia];
Dog *d1 = (Dog *)a1;//强制类型转换
[d1 kanJia];//这样就可以调用狗特有的方法
注意:
在多态中,父类可以访问子类特有的方法———— 强制类型转换
假设 子类 Dog 有一个特有的方法bark [dog bark]; Animal *an2 = [Dog new];
[(Dog*)an2 bark]; //把父类的指针,强制类型转换
*如果不存在多态,也就是说父类子类之间没有继承关系,是不能这么操作的
实例变量的修饰符
1)@public (公开的)在有对象的前
相关文章推荐
- 一个简单的asp数据库操作类
- PostgreSQL教程(三):表的继承和分区表详解
- C#实现用于操作wav声音文件的类实例
- C#类的多态性详解
- 在线管理数据库 类
- C#与.net高级编程 C#的多态介绍
- C#中面向对象编程机制之多态学习笔记
- Lua面向对象之类和继承浅析
- Lua中类的实现原理探讨(Lua中实现类的方法)
- Lua中的类编程代码实例
- 浅析Ruby中继承和消息的相关知识
- 总结一周内学习的Sql经验(一)
- C#中的多态深入理解
- C#常用目录文件操作类实例
- c# 类和成员的修饰详细介绍
- C#中实现判断某个类是否实现了某个接口
- C#类的创建与初始化实例解析
- C#基础语法:结构和类区别详解
- 深入c# 类和结构的区别总结详解