黑马程序员——入学Blog03----OC的self,super,类方法与对象方法
来源:互联网 发布:淘宝美工的岗位要求 编辑:程序博客网 时间:2024/05/16 12:39
-----------android培训、java培训、iOS培训、.Net培训、期待与您交流!------------
先看一个Java的例子
package com.think.test;public class Test {private int number;public void setNumber(int number){this.number = number;}public void printNumber() {this.setNumber(5); // < 1 >System.out.println(this);System.out.println("The instance variable number of Test class are equal to " + this.number);}public static void main(String[] args) {Test test = new Test();System.out.println(test);test.printNumber();}}运行结果:
从中可以看出this是指向对象自身的指针,所以this.number 代表着Test类的成员变量,在setNumber中使用this,是为了避免作为参数传递进setNumber方法的number与成员变量同名而无法区分。而在调用对象方法时,因为已经知道是哪个对象调用了,所以this是可以省略的。
OC中也有类似的关键字,即self,不过self不仅可以指代对象,也可以指代类,取决于调用者
1. self 关键字
//// main.m#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]){ @autoreleasepool { Person *p = [[Person alloc] init]; [p setAge:23]; NSLog(@"%@",p); NSObject *obj = [Person gym]; // 得到调用类方法的self对象 Class c = [Person class]; // Person类class方法返回类对象 NSLog(@"%@",c); BOOL b = c == obj ? YES : NO; NSLog(@"%d",b); // < 2 > } return 0;}
//// Person.h#import <Foundation/Foundation.h>@interface Person : NSObject{ int _age;}// _age的setter与getter- (void) setAge:(int)age;- (int) age;// 人走路+ (void) walk;// 人跳跃+ (void) jump;// 人做体操+ (id) gym;@end
//// Person.m#import "Person.h"@implementation Person// _age的setter与getter- (void) setAge:(int)age{ self->_age = age; // 输出self NSLog(@"%@",self);}- (int) age{ return _age;}// 人走路+ (void) walk{ NSLog(@"走一步");}// 人跳跃+ (void) jump{ NSLog(@"跳一步");}// 人做体操+ (id) gym{ // walk一下,jump一下,就做好体操了 [self walk]; [self jump]; // 输出self NSLog(@"%@",self); return self;}@end
分析:由第一与第二个的输出可以得到Person对象p在响应setAge方法时,此时的self对象就是p,而最后输出的布尔值1,证明了通过class方法得到的该类的类对象与通过调用类方法[Person gym]所返回的self对象相等,此时self是指向该类的类对象。
相关问题1:对象能调用类方法吗?
相关问题2:类能调用对象方法吗?
解答1:在 < 2 > 添加如下代码
[p gym];
Xcode 报错
所以 不能
解答2: 同样在< 2 > 添加如下代码
[Person setAge:23];Xcode 报错
所以 不能
2. super 关键字
有时候,我们需要调用父类的方法,为了确定到底是要调用父类的,还是子类的,所以使用super关键字来区分,比如在前面的构造init方法中有这样的代码
if (self = [super init]){ self.gname = gname; self.category = category;}这里就调用了父类(NSObject)的init方法,进行初始化对象的操作,当然,不仅仅是init方法,当子类不是完全替代父类,而是在父类的基础上,再进行一些操作时,也可以使用super关键字。
//// Student.h#import "Person.h"@interface Student : Person+ (void) gymbetter;@end
//// Student.m#import "Student.h"@implementation Student+ (void) gymbetter{ // [super gym]; [self walk]; [self jump]; [super gym];}@end
main.m中< 2 > 添加
[Student gymbetter];运行结果:
3.类方法
类方法前有 +号 , 调用形式为 [ 类名 方法名],效率比对象方法高,但是不能访问直接成员变量,比如一个计算器类,那么加减乘除的计算方法使用类方法比较合适
4.对象方法
对象方法前有 - 号,调用形式为[ 对象名 方法名], 能直接访问成员变量,但依赖于对象,比如计算器有多个按钮和一个显示屏,通过按钮修改显示屏的方法使用对象方法比较合适
ji
- 黑马程序员——入学Blog03----OC的self,super,类方法与对象方法
- 黑马程序员——入学Blog04----OC的构造方法
- 黑马程序员—OC—类方法 && self
- 黑马程序员--OC基础--类方法、对象方法和self的使用
- OC-对象方法/类方法/self/super(1)
- 黑马程序员---OC基础---OC简介、OC与C的差异、类和对象与方法
- 黑马程序员——OC语言------set和get方法(封装)、类方法、self关键字
- 黑马程序员——类方法与self关键字
- 黑马程序员 oc随记 类方法与对象方法
- 黑马视频学习笔记-OC-self,类方法,对象方法
- ——黑马程序员——OC中self和super关键字的使用
- 黑马程序员—OC语言的self关键字和super关键字
- 黑马程序员——入学Blog09----OC的Block
- 黑马程序员——OC基础语法----类、对象、方法
- 黑马程序员_OC面向对象的三大特性之封装及OC中类方法和self的使用
- 黑马程序员-OC语言-关键字self与super
- 黑马程序员-OC-类方法和对象方法的调用
- 黑马程序员——入学Blog05----OC的protocol与代理模式
- 《Linux高性能服务器编程》学习笔记——第五章 Linux网络编程基础API(2)
- Merge Two Sorted Lists
- HDU -- 2016 数据的交换输出
- arcgis API for Android 读取*.geodatabase文件
- 2015年微信营销趋势分析与归纳!
- 黑马程序员——入学Blog03----OC的self,super,类方法与对象方法
- Unity3D公路绘制、自定义树的创建和Transform
- HDU 2017 -- 字符串统计
- hadoop-java——MapReduce编程框架的设计
- 关于mysql SQL语句的细节
- 那些年坑爹的室友
- HDU 2019 -- 数列有序!
- sublime text 3 编辑器 perl支持
- MFC设置对话框合理性验证的字符串