前言
关于继承的概念,我就不在这里就多啰嗦,用一句话来说就是,子承父业,子类是父类的超集.
在Objective-C中,我们想要继承一个我们想让某个类继承与某个基类,我们需要在这个类的.h文件中这个类名后面加上 :基类 这样就表示当前类继承于某个基类,如下代码所示,Object就是继承于NSObject.
#import <Foundation/Foundation.h>
@interface Object : NSObject
@end
</br>
Java中的继承
在Java中的继承是需要使用关键词 extends 来表示继承关系的.比如有Student和People两个类,我们想让Student类继承于People类.我们可以如下书写代码.
public class Student extends People {
}
如果一个类没有写继承于哪个基类的话,那么这个类隐式地从Java的标志根类Object进行了继承.如下所示,当我们创建一个类的时候,系统会在继承基类这一项中默认的填写上继承于Java的标志根类Object.
在子类中我们可以访问到父类中的各种方法以及属性,当然我们需要根据属性和方法的修饰词了来决定了我们是否具有访问权限了.这里就不过多啰嗦了.
初始化基类
在Think in Java(Java编程思想)这本书中第7章复用类中对初始化基类有这样的一段解释.
从外部看来,派生类是一个与基类具有相同接口的新类,或许还会有一些额外的的方法和域 。但继承并不仅仅是类的复用。当创建了一个派生类的对象时,该类包含了一个基类的子对象。这个子对象和你用基类直接创建的对象没有什么两样。二者的区别在于,后者来自于外部,而基类的子对象来自于派生类对象的内部。对基类的子对象初始化时至关重要的,而且也只有一种方法来保证这一点,那就是在派生类的构造器中调用基类的构造器,而基类的构造器具有执行基类初始化所需的所有能力和知识。
上面一段文字和图片如果看起来仍然很抽象的话,下面我们就接着Student和People两个类来进行说明.Student是继承于People这个类的,我们在People类中重写People的构造器方法,让它打印一句话.如下所示.
public class People {
public People() {
System.out.println("父类方法");
}
}
然后我们在任意的一个位置创建一个Student对象.在控制台会打印出如下的信息.
这样我们就上面例子中得到一个结论,派生类构建过程是从基类"向外"扩散的,所有基类在派生类构造器可以访问它之前,就已经完成了初始化,即使不为派生类创建构造器,编译器也会为你合成一个默认的构造器,改构造器将会调用基类的构造器.
假定,我们在People类中重构了一个带有参数的构造器方法,如下所示.
public class People {
public People(int i) {
System.out.println("父类参数方法"+i);
}
}
我们想让创建Student对象的时候调用这个这个带有参数的构造器方法,这种情况,我们该如何处理呢,这时候我们就需要使用Java中的另一个关键字super,使用super来显式的编写调用基类构造器的方法.这样就能完成我们的需求了.
public class Student extends People {
public Student() {
super(1);
}
}
这时候我们再在任意的一个位置创建一个Student对象.运行程序,在控制台则会打印出如下的信息.
这里对super关键字多说两句,我们使用super关键字不但可以直接访问构造器方法,我们也可以使用super*调用具有访问权限的方法和属性,这样我们就可以拿到基类的属性和方法了.我们假定在People类中有一个属性叫做peopleName,我们在peopleName初始化的时候给它赋值,如下所示.
public String peopleName = "骚栋";//姓名
我们就可以在Student对象中使用super关键字来访问到这个属性.使用方式如下所示.当然了,基类中的方法与属性调用时一样的.
super.peopleName
本文所有内容详情可查看Think in Java(Java编程思想)第七章的继承部分,所以还是建议大家去看原书.本文只是作为学习笔记,如有纰漏,欢迎指出.