[03]类和对象
来源:互联网 发布:java redis maven 编辑:程序博客网 时间:2024/05/11 14:09
以Car为例:
1、类的声明和实现
//类的声明@interface Car {}@end//类的实现@implementation Car@endint main(){ return 0;}
2、对象的创建
#import<Foundation/Foundation.h>//类的声明@interface Car : NSObject//(继承语法):NSObject使得类具有创建对象的能力{}@end//类的实现@implementation Car@endint main(){ Car *p = [Car new];//利用类来创建对象:[行为执行者 行为名称] return 0;}
3、对象的行为
区分函数和对象行为:
都作为功能:
①函数:C语言中 void run();
②行为:OC中 - (void)run;
都有三要素:名称、参数、返回值
#import<Foundation/Foundation.h>//类的声明@interface Car : NSObject//(继承语法):NSObject使得类具有创建对象的能力,所以需要包含头文件{}- (void)run;@end//类的实现(定义)@implementation Car- (void)run{ NSLog(@"Car is running!");}@endint main(){ Car *p = [Car new];//利用类来创建对象:[行为执行者 行为名称],在使用类创建对象之前,会将类加载进内存 [p run];//消息机制:给指针p所指的对象发送一条run消息 return 0;}
理解:消息机制
4、成员变量及其赋值
#import<Foundation/Foundation.h>//类的声明@interface Car : NSObject{ int speed;//属性(成员变量、实例变量:默认会初始化为0) int wheels;}- (void)run;@end//类的实现(定义)@implementation Car- (void)run{ NSLog(@"Car is running!");}@endint main(){ Car *p = [Car new]; [p run]; return 0;}
5、方法与成员变量
#import<Foundation/Foundation.h>//类的声明@interface Car : NSObject{ @public//①如果没有这句代码,会怎么样呢? int speed;//属性(成员变量、实例变量:默认会初始化为0) int wheels;}- (void)run;@end//类的实现(定义)@implementation Car- (void)run{ NSLog(@"Car is running!"); NSLog(@"speed is %dkm/s, the car has %d wheels", speed, wheels);}@endint main(){ Car *p = [Car new]; [p run]; p->speed = 120; p->wheels = 3; return 0;}
对于①,如果没有,则:instance variable ‘speed’ is protected
输出结果是:speed is 0km/s, the car has 0 wheels,证明了它会默认为0
利用上面的知识点,看看下面这个程序:
#import<Foundation/Foundation.h>@interface Person : NSObject{ @public double weight; int age;}- (void)sing;@end@implementation Person- (void)sing{ NSLog(@"\aThere is a(an) %d-year-old girl singing under the tree.She's %lf kg", age, weight);}@endint main(){ Person *p1 = [Person new]; p1->weight = 45.2; [p1 sing]; Person *p2 = [Person new]; p2->age = 22; [p2 sing]; return 0;}
There is a(an) 0-year-old girl singing under the tree.She’s 45.200000 kg
There is a(an) 22-year-old girl singing under the tree.She’s 0.000000 kg
6、对象的简单内存分析
(1)类中有方法列表
(2)每个对象内部默认都有一个isa指针(作用:指向对象所指向的类),这样看来:每个对象都在共用方法,但是访问成员变量是访问对象内部的成员变量(每个对象的都不相同)
方法列表在类中,成员变量在各对象内部
7、对象与函数参数
#import<Foundation/Foundation.h>@interface Person : NSObject{ @public double weight; int age;}- (void)sing;@end@implementation Person- (void)sing{ NSLog(@"\aThere is a(an) %d-year-old girl singing under the tree.She's %lf kg", age, weight);}int changeNum(double w, int a){ w = 55; a = 99; return 0;}@endint main(){ Person *p = [Person new]; p->weight = 45.2; p->age = 22; changeNum(p->weight, p->age); [p sing]; return 0;}
值传递
There is a(an) 22-year-old girl singing under the tree.She’s 45.200000 kg
#import<Foundation/Foundation.h>@interface Person : NSObject{ @public double weight; int age;}- (void)sing;@end@implementation Person- (void)sing{ NSLog(@"\aThere is a(an) %d-year-old girl singing under the tree.She's %lf kg", age, weight);}int changeNum(Person *changeP){ changeP->weight = 55; changeP->age = 99; return 0;}@endint main(){ Person *p = [Person new]; p->weight = 45.2; p->age = 22; changeNum(p); [p sing]; return 0;}
更改了实例变量
There is a(an) 99-year-old girl singing under the tree.She’s 55.000000 kg
#import<Foundation/Foundation.h>@interface Person : NSObject{ @public double weight; int age;}- (void)sing;@end@implementation Person- (void)sing{ NSLog(@"\aThere is a(an) %d-year-old girl singing under the tree.She's %lf kg", age, weight);}int changeNum(Person *changeP){ Person *p1 = [Person new];//① p1->weight = 999.99; p1->age = 999; changeP = p1; changeP->age = 100000000; return 0;}@endint main(){ Person *p = [Person new];//② p->weight = 45.2; p->age = 22; changeNum(p); [p sing]; return 0;}
There is a(an) 22-year-old girl singing under the tree.She’s 45.200000 kg
结果没改变,为什么?
从①和②看出,p和p1是共用方法不互干扰的两个独立对象,即:p1的属性不影响p
虽然在调用函数时将p地址传给changeP,由于没有进行操作,p属性没有改变,但后来changeP指向p1,改变的也只是p1中的实例变量,下面通过实例,看看是不是这样的
#import<Foundation/Foundation.h>@interface Person : NSObject{ @public double weight; int age;}- (void)sing;@end@implementation Person- (void)sing{ NSLog(@"\aThere is a(an) %d-year-old girl singing under the tree.She's %lf kg", age, weight);}int changeNum(Person *changeP){ Person *p1 = [Person new]; p1->weight = 999.99; p1->age = 999; changeP = p1; changeP->age = 111; NSLog(@"p1->weight = %lf, p1->age = %d", p1->weight, p1->age);//重点 return 0;}@endint main(){ Person *p = [Person new]; p->weight = 45.2; p->age = 22; changeNum(p); [p sing]; return 0;}
2015-11-13 00:04:22.215 a.out[876:89224] p1->weight = 999.990000, p1->age = 111
2015-11-13 00:04:22.216 a.out[876:89224] There is a(an) 22-year-old girl singing under the tree.She’s 45.200000 kg
- [03]类和对象
- 【面向对象】对象和类
- 面向对象--类和对象
- 面向对象(类和对象)
- 面向对象-类和对象
- 面向对象----类和对象
- Objective-C入门03:类和对象
- OC基础-类和对象03
- JAVA学习笔记03类和对象
- 类和对象
- vfp对象和类
- 类和对象
- Chap02:类和对象
- 类、对象和方法
- C#类和对象
- 第一章 类和对象
- 类和对象
- 对象、类和结构
- [leetcode-304]Range Sum Query 2D - Immutable(java)
- 从校园到工作的路(八)——关于编程中的编码问题
- 网站tips
- 检测未回收的堆内存
- 将ResultSet转为List
- [03]类和对象
- 网页视频下载方法二:手机浏览器下载
- 《动态规划》hdoj acm 3.3.7 二维费用背包
- Objective-c:封装、继承与多态
- 事件过滤器 不是很明白
- JQuery插件Mmenu使用入门
- UVA 10033Interpreter (模拟)
- (加入显示电量功能)模仿魅族、华为、小米电池续航管理软件, 动态水波纹滚动的圆形小球View
- 《二分》hdoj acm 4.1.2