A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© SailY 中级黑马   /  2014-9-13 21:47  /  1892 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

类的设计:
1、类名
1>类名的第一个字母必须大写
2>不能有下划线
3>多个英文单词,用驼峰标识


1>属性跟功能的声明都写在 @interface 和 @end 之间,且属性声明写在 { } 里面,功能声明,也就是方法声明,写在 { } 外面。类的实现写在 @implementation 和 @end 之间。例如:

#import<Foundation/Foundation.h>

//类的声明
@interface Person : NSObject
{
    @public
    int age;
    double weight;
}
- (void)walk;
@end
// 类的实现
@implementation Person
- (void)walk
{
    NSLog(@"走了一段路");
}
@end

int main()
{
    Person *p = [Person new];
    p->age = 20;
    p->weight = 50;
    [p walk];
    return 0;
}

// 利用Person这个类创建了2个Person类型的对象
//    类本身也是一个对象,是个class类型的对象,简称类对象
    Person *p = [[Person alloc]init];
    Person *p2 = [[Person alloc]init];
    Person *p3 = [[Person alloc]init];

    // 获取内存中得类对象
    Class c = [p class];
    Class c2 = [p2 class];
    Class c3 = [Person class];

    NSLog(@"c=%p,c2=%p,c3=%p",c,c2,c3);
发现内存地址都一样


#import "Person.h"
@implementation Person

//  当程序启动的时候,就会加载项目中所有的类和分类,而且加载完毕后就会调用每个类和分类的+load方法,只会调用一次
+(void)load
{
    NSLog(@"Person---load");
}

//   当第一次使用某个类的时候,就会调用当前类的+initialize方法,可以理解为类的初始化。优先级是分类—>类—>父类。
+(void)initialize
{
       //    可以监听这个类在什么时候使用
    NSLog(@"Person---initialize");
}
//   不论是load还是initialize,都是先加载父类再加载子类,分类最后加载,先初始化父类,再初始化子类。
//   而且初始化时,分类优先级大于父类,只初始化分类。
//
@end


分别为:编译,链接,执行
cc -c 第一个程序.m
cc 第一个程序.o -framework Foundation
./a.out

编译:.m文件生成.o文件,此过程可以理解为将高级语言翻译为计算机可以理解的二进制代码,就是0跟1。这个过程只要所有的语法正确,编译器就可以编译出中间目标文件,如果函数与变量的声明的不正确,会由警告,但还是会生成.o文件。

链接:.o文件生成.out 文件,大量的Object File合成执行文件,这个动作叫作链接,也就是把多个.o 文件合成.out执行文件。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的.o中找寻函数的实现,如果找不到,那到就会报链接错误。

继承的好处:
1. 抽取重复代码
2. 建立了类之间的关系
3. 子类可以拥有父类中的所有成员变量和方法

使用场合:
1. 当两个类拥有相同的属性和方法时,就可以将相同的东西抽取到一个父类中
2. 当A类完全拥有B类中得部分属性和方法时,就可以考虑让B类继承A类

注意点:
1. 基本上所有类的跟类是NSOject
2. 只要子类继承了父类,父类中所有成员变量、方法,子类都拥有,只是子类能不能访问

@private : 只能在当前类的对象方法(中直接访问,(@implementation中默认就是 @private)
@protected : 可以在当前类以及子类的对象方法中直接访问(@interface中默认就是 @protected)
@public : 任何地方都可以直接访问对象的成员变量
@package : 同一个“体系内”(框架)可以访问,介于 @private和 @public之间

@implementation和 @interface中不能声明同名的成员变量

重写:子类重新实现父类中的某个方法,覆盖父类以前的做法
注意:
1. 父类必须声明在子类的前面
2. 子类不能拥有和父类相同的成员变量
3. 调用某个对象的方法时,优先去当前对象中找,如果找不到,去父类中找

坏处:耦合性太强,即:两个类的关系太强了,类B继承类A,类A离不开类B,类B也离不开类A

继承:

A
{
   int _age;
   int _no;
}
B :A
{
   int _weight;
}


组合:
A
{
   int _age;
   int _no;
}
B
{
   A *_a;
   int _weight;
}

什么时候用继承,什么时候用组合呢?
套用这句话:
继承: XX 是 XXX
组合:XXX 拥有 XXX

学生是个成绩,学生拥有成绩,后面的读着顺口点,就用组合。



评分

参与人数 1技术分 +1 收起 理由
★彬★卍囧神 + 1 坚持 下去加油

查看全部评分

5 个回复

倒序浏览
好,学习了!
回复 使用道具 举报
厉害啊                              
回复 使用道具 举报
楼主一定要坚持下来,每天总结,才能有大的收获
回复 使用道具 举报
过来学习
回复 使用道具 举报
学习了,楼主学习态度很好啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马