为什么可以定义一个具有超类类型的变量,但是为它分配一个子类的对象?

Tha*_*nks 1 c objective-c

这对我来说还不是很清楚.例:

NSArray*arr = [[NSMutableArray alloc] init];

我的意思是......是的,它有效.但是:为什么我可以告诉编译器"嘿,我的var只是一个NSArray,你只需要保留空间以便它适合那里"然后,实际上,有一个大的,胖的NSMutableArray进入那个有道路的地方更多的方法,更多的实例变量,只需要更多的空间.我的意思是......这怎么可能?

我会理解另一种方式:左侧是大胖子NSMutableArray,右侧是小型NSArray.根据我的理解,超类总是比子类更小,更复杂.子类可能会覆盖一些东西,但它也可能会添加一些东西.对?

想象一下,你买了一个车库,因为你的妻子通过电话告诉你,她买了一些可以开车的东西.然后,它不仅仅是你想象的小型车.她买了一辆大卡车.它不适合那里.

那么我该如何思考这个问题呢?;)

这适用于社区维基,只是因为其他人也感到困惑.

Raf*_*ird 5

对象大小与它无关,因为赋值只分配引用(可以将其视为内存地址).引用的大小是固定的,与对象大小无关.


Mic*_*rdt 5

我认为你错误的关键点在于,变量包含对象,编译器会为它们保留空间.

在Objective-C中,就像在Java中一样,变量只包含对象的引用 - 编译器的参与在那里结束.对象本身存在于称为堆的内存区域中,该区域由运行时维护.