1. 父类自身也可以有父类,没有父类的类位于类层次的最顶层,称为根类(父类也可以被称为超类)。
2. 继承中,父类的非私有实例变量和方法都会成为新类定义的一部分。子类可以直接访问这些方法和实例变量,就像在类定义中直接定义了这些子类一样。注意:在子类使用实例变量,必须在接口部分声明,而不是在实现部分声明。在实现部分声明和合成(synthesize)的实例变量时私有的,子类并不能直接访问,需要明确定义或合成取值方法,才能访问实例变量的值。
3. 类的每个实例都拥有自己的实例变量,即使这些变量是继承来的。
4. @class指令:使用@class指令可以提高效率,因为编译器不需要引入和处理整个 Class.h文件(Class是用户自己定义的一个类),只需要知道Class是一个类名。如果需要引用Class类的方法(在实现部分中),@class指令是不够的,因为编译器需要更多的消息。它需要清楚方法有多少参数、它们是什么类型、方法的返回类型是什么。
5.
#import <Foundation/Foundation.h> #import "XYPoint.h" @interface XYPoint : NSObject @property int x, y; -(void) setX: (int) xVal andY: (int) yVal; @end -(void) setOrigin:(XYPoint *)pt{ origin = pt; }
#import <Foundation/Foundation.h> #import "Rectangle.h" #import "XYPoint.h" int main(int argc, const char * argv[]) { @autoreleasepool { Rectangle *myRect = [[Rectangle alloc] init]; XYPoint *myPoint = [[XYPoint alloc] init]; [myPoint setX:100 andY:200]; NSLog(@"Origin at (%i, %i)", myRect.oringin.x, myRect.oringin.y); [myPoint setX:50 andY:50]; NSLog(@"Origin at (%i, %i)", myRect.oringin.x, myRect.oringin.y); } return 0; }
当使用表达式myRect.origin = myPoint 调用setOrigin:方法时,myPoint
的值作为参数传递给该方法。这个值指向存储XYPoint对象的内存,所以
在改变myPoint的值时,myRect.origin.x/y也会随之改变,避免这个问题
的方法就是修改setOrigin:方法,这样就能够创建自己的点,并将origin
设置为这个点。
6. 抽象类:创建类只是为了更容易创建子类,这些类名为抽象类(如
NSNumber类等)。每个具体的属于如NSNumber类的抽象超类的子
类,总称为簇。