黑马程序员技术交流社区

标题: OC中为什么没有重载个人理解 [打印本页]

作者: 一步一个脚印    时间: 2015-4-17 17:01
标题: OC中为什么没有重载个人理解
本帖最后由 一步一个脚印 于 2015-5-1 00:47 编辑

JAVA中的重载是一个类的多态的体现,属于编译时的多态,因为方法的调用是编译器根据参数类型、顺序、个数决定的。JAVA还有一种多态称为运行时多态,JVM会根据对象的实际类型来动态选择调用的方法,OC的多态和JAVA的这种运行时多态的概念是一致的。尽管OC也有静态类型检查,但是OC程序在运行时才确定对象的实际类型(不是引用变量的类型)和参数以及方法,如果一个类中存在同名的方法(参数个数一样),OC编译器将会警告或者在运行时报错,因为OC语言设计的时候就要求方法签名要唯一,如果不唯一,编译器当然要警告,在运行时运行时环境将不知道执行方法签名相同的那个方法,所以会在运行时报错。需要注意的是:方法参数个数不一样在OC中属于另外一个方法,而不是JAVA中的重载。
作者: 15098037606    时间: 2015-4-17 17:07
楼主知道得好多。
作者: 一步一个脚印    时间: 2015-5-6 15:42
在OC源代码中给对象发送消息,编译器会将源代码转换成支持运行时的数据结构和函数调用,函数调用中会传入对象  和选择器(SEL类型变量),以及消息实现的具体代码地址,如果一个类中有重载的方法(方法名和参数个数一样的方法),编译的时候就会报错,运行时如果方法签名(相当于在@interface 中对方法的声明)不一致,将会在运行时出错,根据编程逻辑,或抛出错误或程序停止,或进行其他的处理)。
作者: fantacyleo    时间: 2015-5-7 22:34
我觉得原因就是“OC的设计者决定不支持重载”。动态性和重载并非水火不容,java就是很好的例子。
作者: 一步一个脚印    时间: 2015-5-15 12:43
OC中的id类型很特殊,用id类型定义的变量,将不会进行静态类型检查,而是在运行时才确定类型。如果类中有重载的方法(方法名一样,也就是参数个数也一样,参数类型不一样),因为编译时候会将方法名转换成SEL类型的变量,每个方法名的SEL类型变量或者说标志都是唯一的,如果类中有相同的方法名,编译器肯定要报错,这是要确保方法的SEL类型的标识符的唯一性。保证唯一性目的是什么呢?因为编译器会把消息发送,转成函数调用,函数调用中会传入接收消息的对象和消息名(即方法名)的SEL类型变量,以及消息中的参数。运行时运行时系统会确定对象的实际类型时,会根据对象的isa指针定位它的类对象,从类对象中搜索有没有SEL类型标示的方法,没有,就到对象的类对象的父类对象中搜索,一直搜索到类对象NSObject中。如果发现一个类对象中存在多个同名的方法但是参数类型不一样,它怎么确定用哪个呢?所以方法签名从编译时到运行时都要是唯一的。
作者: mony    时间: 2015-5-15 13:01
我想先知道,楼主怎么理解OC里面的方法名。比如-(void)test1ByString:(NSString *)temp Int:(int)tempNum;这个方法,方法名是什么
作者: 仰望的繁华    时间: 2015-5-15 14:12
同楼上。
虽然没接触过java,不过OC视频里说的很清楚:冒号也是方法名的一部分。

参数个数不同,冒号个数也不同,怎么可能是同一个方法?
作者: 一步一个脚印    时间: 2015-5-15 18:06
mony 发表于 2015-5-15 13:01
我想先知道,楼主怎么理解OC里面的方法名。比如-(void)test1ByStringNSString *)temp Intint)tempNum; ...

test1ByString::Int
作者: cui0wei0    时间: 2015-5-15 21:32
OC是C语言的扩展, JAVA和C#比OC高级多了
作者: liu01230    时间: 2015-5-16 15:00
学习了,楼主专业啊
作者: 挑战    时间: 2015-5-16 22:00
学习了。。。。。
作者: wwwwjay    时间: 2015-5-16 23:22
学习了!!!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2