一,定义类
Object-C中定义类需要两个步骤:
1,接口部分:定义该类包含的成员变量与成员方法。
2,实现部分:为该类的方法提供实现。
下面是接口部分的声明
#import <Foundation/Foundation.h>注意:
@interface Student : NSObject{
NSString *_name;
int _age;
}
- (id)initWithString:(NSString *)name age:(int)age;
- (void)display;
@end
1,Object-C建议成员变量名以下划线(_)开头。
2,方法的类型标识符:"+"表示该方法是类方法,"-"表示该方法是成员方法。
3,Object-C的成员变量都是实例变量,Object-C并不支持真正的类变量。
3,除第一个形参外,Object-C建议为后面的每个形参指定一个形参标签,这个形参标签能很好的说明该形参的作用。
4,在Object-C的方法声明中,所有的类型(包括void)都应该使用圆括号括起来,这是Object-C方法与C++函数的区别之处。
下面是类的实现部分
#import "Student.h"注意:
@implementation Student{
NSString *_number;
int _gender;
}
- (id)initWithString:(NSString *)name age:(int)age{
if(self = [super init]){
}
return self;
}
- (void)display{
}
- (void)Func{
}
1,类的实现部分,必须实现在接口中声明的所有方法。
2,类的实现部分也可以声明自己的成员变量,但这些成员变量只能在当前的类内访问,这相当于类的隐藏的成员变量。
3,在类的实现部分可以声明自己的方法,但这些方法只能在当前的类内访问。
二,创建类对象
无论是创建哪个类的对象,最先被调用的是该类的alloc类方法来分配内存,这个alloc方法是在NSObject类中声明的,而所有的Object-C类都是NSObject的子类,因此所有的类都可以使用alloc方法来分配内存。分配完内存要对对象进行初始化,Object-C最常用的初始化方法是init方法,该方法同样是来自NSObject。下面的代码是创建一个Student类对象
Student *p = [[Student alloc] init];
p->name = @"zhangsan";
[p display];
通过对象访问成员变量的语法格式
对象->成员变量,例如:p->name = @"zhangsan";
通过对象访问成员方法的语法格式
[对象 成员方法],例如:[p display];
三,隐藏与封装
Object-C提供了四个访问控制符,@public、@private、@protected、@package,在类的接口部分声明的成员变量的默认访问权限是@protected。使用访问控制符应注意的问题
注意:
1,Object-C中的访问控制符只能用来修饰成员变量,不能修饰成员方法与属性。
2,不能在访问控制符后面加":",下面是错误的写法
@interface Student : NSObject{
@private:
NSString *_name;
int _age;
}
四,继承
1,继承的实现
Object-C中的继承通过": 父类"语法来实现,下面是一个具体的实例:
@interface Student : NSObject{
NSString *_name;
int _age;
}
当子类继承父类时,子类可以获取父类的如下东西
1,全部成员变量。
2,全部方法(包括初始化方法)。
2,super关键字
使用super关键字访问父类中被覆盖的方法
- (id)initWithString:(NSString *)name age:(int)age{
if(self = [super init]){
}
return self;
}
五,多态
下面声明两个类,一个父类Base,一个子类Derived
//定义父类Base
@interface Base : NSObject
- (void)test;
@end
@implementation Student
- (void)test{
NSLog(@"Base test");
}
@end
//定义子类Derived
@interface Derived : Base
- (void)test;
@end
@implementation Derived
- (void)test{
NSLog(@"Derived test");
}
@end
多态的实现
Base *p = [[Base alloc] init];子类是一种特殊的父类,因此,Object-C允许把一个子类对象直接赋值给一个父类指针变量,无需任何类型转换,称之为向上类型转换。
//调用的是Base::test
[p test];
p = [[Derived alloc] init];
//调用的是Derived::test
[p test];