oc 面向对象特性(实例成员变量作用域限定符,类变量和类方法)
2014-10-10 12:39
337 查看
实例成员变量作用域限定符
•即便从封装的角度出发,实例成员变量应该定义为@private,但作为一种面向对象的语言,Objective-C支持@public、@private和@protected作用域限定。如果一个实例变量没有任何的作用域限定的话,那么缺省就是@protected。
•@public作用域限定的实例变量,可以在任何情况下访问;•@private作用域限定的实例变量,只能在这个类里面才可以访问;
•@protected作用域限定的实例变量,可以在这个类里面和这个类的派生子类里面可以访问这个变量,在类外的访问是不推荐的,但也可以访问。
Access.h文件和Access.m文件:
调用的main函数:
小结
@public、@private和@protected作用域限定只能修饰的实例成员变量,不能修饰类变量,更不能修饰方法 。
类变量和类方法
ClassA.h文件:
ClassA.m文件:
说明:
init方法是默认构造方法,在这个构造方法中累计类变量count,在实例方法中可以访问类变量的,但是类方法不能访问实例变量。initCount 方法是一个普通的类方法,用于返回类变量count,initialize方法是非常特殊的类方法,它是在类第一次访问时候被自动调用,因此它一般用来初始化类变量的,类似于C#中的静态构造方法。
调用的main函数:
小结:
在第一次实例化ClassA时候会调用两个方法: initialize类方法和实例构造方法init,然后再次实例化ClassA时候只是调用实例构造方法init,而没有调用initialize类方法。
这样类变量count被一直累加,它隶属类因此c1实例可以访问,c2和c3都可以访问。
•即便从封装的角度出发,实例成员变量应该定义为@private,但作为一种面向对象的语言,Objective-C支持@public、@private和@protected作用域限定。如果一个实例变量没有任何的作用域限定的话,那么缺省就是@protected。
•@public作用域限定的实例变量,可以在任何情况下访问;•@private作用域限定的实例变量,只能在这个类里面才可以访问;
•@protected作用域限定的实例变量,可以在这个类里面和这个类的派生子类里面可以访问这个变量,在类外的访问是不推荐的,但也可以访问。
Access.h文件和Access.m文件:
@interface Access: NSObject { @public int publicVar; @private int privateVar; @protected int protectedVar; } @end #import "Access.h" @implementation Access @end
调用的main函数:
#import <Foundation/Foundation.h> #import "Access.h" int main (int argc, const char * argv[]) { Access *a = [[Access alloc] init]; a->publicVar = 5; NSLog(@"public var: %i\n", a->publicVar); a->protectedVar = 6; NSLog(@"protectedVar var: %i\n", a->protectedVar); //不能编译 //a->privateVar = 10; //NSLog(@"private var: %i\n", a->privateVar); return 0; }
小结
@public、@private和@protected作用域限定只能修饰的实例成员变量,不能修饰类变量,更不能修饰方法 。
类变量和类方法
ClassA.h文件:
#import <Foundation/NSObject.h> static int count; @interface ClassA: NSObject +(int) initCount; +(void) initialize; @end
ClassA.m文件:
#import "ClassA.h" @implementation ClassA -(id) init { self = [super init]; count++; return self; } +(int) initCount { return count; } +(void) initialize { count = 0; } @end
说明:
init方法是默认构造方法,在这个构造方法中累计类变量count,在实例方法中可以访问类变量的,但是类方法不能访问实例变量。initCount 方法是一个普通的类方法,用于返回类变量count,initialize方法是非常特殊的类方法,它是在类第一次访问时候被自动调用,因此它一般用来初始化类变量的,类似于C#中的静态构造方法。
调用的main函数:
#import <Foundation/Foundation.h> #import "ClassA.h" int main( int argc, const char *argv[] ) { ClassA *c1 = [[ClassA alloc] init]; ClassA *c2 = [[ClassA alloc] init]; // print count NSLog(@"ClassA count: %i", [ClassA initCount] ); ClassA *c3 = [[ClassA alloc] init]; NSLog(@"ClassA count: %i", [ClassA initCount] ); [c1 release]; [c2 release]; [c3 release]; return 0; }
ClassA count: 2 ClassA count: 3
小结:
在第一次实例化ClassA时候会调用两个方法: initialize类方法和实例构造方法init,然后再次实例化ClassA时候只是调用实例构造方法init,而没有调用initialize类方法。
这样类变量count被一直累加,它隶属类因此c1实例可以访问,c2和c3都可以访问。
相关文章推荐
- oc 面向对象特性(属性,构造方法)
- oc 面向对象特性(接口,实现,方法发送,访问成员变量)
- ADA程序实例(面向对象特性之多态)
- Java - 类 - 对象 - 方法 - 构造器 - 面向对象程序设计三大特性
- OC面向对象特性
- OC笔记 - 面向对象特性(2015.1.28)
- OC 继承子类对象调用方法机制 子类对象访问父类中的实例变量
- 面向对象-三大特性(OC代码)
- Java编程那些事儿61—面向对象设计方法和面向对象特性(一)
- 黑马程序员--学习OC面向对象特性
- 黑马程序员——OC语言基础篇---面向对象之三大特性
- oc面向对象特性: 多态
- Javascript 面向对象一:封装数据个方法,从原型对象生成实例
- 2.0 面向对象 类与实例(关键字)、封装、继承、多态(虚方法,抽象类,抽象方法,接口)
- OC基础语法<1.2> 入门面向对象语法-构造方法和description
- 面向对象之字段,属性,类,实例,构造方法,重载
- Java编程那些事儿61—面向对象设计方法和面向对象特性(一)
- 黑马程序员------oc之面向对象特性 封装、多态、继承等
- PHP基础----面向对象相关特性----12类的继承与方法重写