继承
就是父类和子类。根类和子类。
父类的非私有实例变量和方法都会成为新类定义的一部分。
在子类中使用父类的实例变量,父类必须先在接口部分声明。
父类在实现部分声明和合成的实例变量是私有的,子类中并不能直接访问。
需要明确定义或合成取值方法,才能访问实例变量的值。
也就是在接口部分声明的变量/方法是公开的。
类的每个实例都拥有自己的实例变量,即使这些实例变量是继承来的。
查找方法
先找子类,再找父类,找到为止。如无法找到,则报错无法相应这个方法。
继承通常用于扩展一个类。
扩展自己或他人以前实现的类,使它适合自己的需要。
分类:允许你以模块的方式向现有类定义添加新的方法。
@class 指令
如果使用一个类,却不需要了解这个类的实现(使用它的方法、实例变量),可以用@class 声明这个类,不用import
只是告诉编译器,这是一个类。
实例基本是指针,所以在生成,拷贝,返回时,注意其是已有的指针,还是新生成的实例变量。
不要直接返回子类变量的指针,容易被修改。想修改可以通过添加取值方法,创建一个对象的副本,并返回副本的对象。
覆写方法
不能通过继承删除或减少方法,但是可以通过覆写来更改继承方法的定义。
只要定义一个同名的方法,使用和父类相同的名称定义的方法代替或覆写了继承的定义。
新方法必须具有相同的返回类型,并且参数的树木与覆写的方法相同。
好像可以在父类中使用子类的方法?不过不建议这么做。
为什么创建子类?
1. 希望继承一个类的函数,也许加入一些新的方法和/或实例变量。
2. 希望创建一个类的特别的版本。
3. 希望通过覆写一个或多个方法来改变类的默认行为。
抽象类
有时候创建类只是为了更容易创建子类。这些类可以成为抽象类或抽象超类。
可以定义任何方法和实例变量,但不期望任何人从这个类创建实例。