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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 一步一个脚印 于 2015-5-1 00:47 编辑

JAVA中的重载是一个类的多态的体现,属于编译时的多态,因为方法的调用是编译器根据参数类型、顺序、个数决定的。JAVA还有一种多态称为运行时多态,JVM会根据对象的实际类型来动态选择调用的方法,OC的多态和JAVA的这种运行时多态的概念是一致的。尽管OC也有静态类型检查,但是OC程序在运行时才确定对象的实际类型(不是引用变量的类型)和参数以及方法,如果一个类中存在同名的方法(参数个数一样),OC编译器将会警告或者在运行时报错,因为OC语言设计的时候就要求方法签名要唯一,如果不唯一,编译器当然要警告,在运行时运行时环境将不知道执行方法签名相同的那个方法,所以会在运行时报错。需要注意的是:方法参数个数不一样在OC中属于另外一个方法,而不是JAVA中的重载。

11 个回复

倒序浏览
楼主知道得好多。
回复 使用道具 举报
在OC源代码中给对象发送消息,编译器会将源代码转换成支持运行时的数据结构和函数调用,函数调用中会传入对象  和选择器(SEL类型变量),以及消息实现的具体代码地址,如果一个类中有重载的方法(方法名和参数个数一样的方法),编译的时候就会报错,运行时如果方法签名(相当于在@interface 中对方法的声明)不一致,将会在运行时出错,根据编程逻辑,或抛出错误或程序停止,或进行其他的处理)。
回复 使用道具 举报
我觉得原因就是“OC的设计者决定不支持重载”。动态性和重载并非水火不容,java就是很好的例子。
回复 使用道具 举报
OC中的id类型很特殊,用id类型定义的变量,将不会进行静态类型检查,而是在运行时才确定类型。如果类中有重载的方法(方法名一样,也就是参数个数也一样,参数类型不一样),因为编译时候会将方法名转换成SEL类型的变量,每个方法名的SEL类型变量或者说标志都是唯一的,如果类中有相同的方法名,编译器肯定要报错,这是要确保方法的SEL类型的标识符的唯一性。保证唯一性目的是什么呢?因为编译器会把消息发送,转成函数调用,函数调用中会传入接收消息的对象和消息名(即方法名)的SEL类型变量,以及消息中的参数。运行时运行时系统会确定对象的实际类型时,会根据对象的isa指针定位它的类对象,从类对象中搜索有没有SEL类型标示的方法,没有,就到对象的类对象的父类对象中搜索,一直搜索到类对象NSObject中。如果发现一个类对象中存在多个同名的方法但是参数类型不一样,它怎么确定用哪个呢?所以方法签名从编译时到运行时都要是唯一的。
回复 使用道具 举报
我想先知道,楼主怎么理解OC里面的方法名。比如-(void)test1ByString:(NSString *)temp Int:(int)tempNum;这个方法,方法名是什么
回复 使用道具 举报
同楼上。
虽然没接触过java,不过OC视频里说的很清楚:冒号也是方法名的一部分。

参数个数不同,冒号个数也不同,怎么可能是同一个方法?
回复 使用道具 举报
mony 发表于 2015-5-15 13:01
我想先知道,楼主怎么理解OC里面的方法名。比如-(void)test1ByStringNSString *)temp Intint)tempNum; ...

test1ByString::Int
回复 使用道具 举报
OC是C语言的扩展, JAVA和C#比OC高级多了
回复 使用道具 举报
学习了,楼主专业啊
回复 使用道具 举报
学习了。。。。。
回复 使用道具 举报
学习了!!!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马