- 论坛徽章:
- 0
|
官方教程:继承之概述(6)
在前面的课程中,你多次看到继承被提及.在java语言中,类可以派生于其它的类,包括其它类中的属性和方法.
声明:
继承类叫做子类(也叫做派生类,扩展类).被继承的类叫做超类(也叫做基类,父类).
除了Object没有父类,其它的类都有且只有一个父类(单继承).在定义一个类时若没有父类,则隐含继承Object,每一个类都是Object类的子类.
继承的思想是简单并且强大的:当你想创建一个新类,并且已经存在的类中有你想要的代码,你可以从已经存在的类派生出新类.
一个子类从父类继承所有的成员(members).构造函数不是成员,所以不被继承,但是可以在子类中调用父类构造方法.
Java平台的类继承
在java.lang包中的Object类定义并且实现了所有类的共同行为.在Java平台,大多数类直接派生与Object类,下面是类继承结构.
Object类是通用的,在继承结构的最顶端.靠近底端的类则提供更加具体的行为.
一个继承的例子
Java代码- 1.public class Bicycle {
- 2.
- 3. //Bicycle类有三个属性
- 4. public int cadence;
- 5. public int gear;
- 6. public int speed;
- 7.
- 8. //Bicycle类有一个构造方法
- 9. public Bicycle(int startCadence, int startSpeed, int startGear) {
- 10. gear = startGear;
- 11. cadence = startCadence;
- 12. speed = startSpeed;
- 13. }
- 14.
- 15. //Bicycle有四个方法
- 16. public void setCadence(int newValue) {
- 17. cadence = newValue;
- 18. }
- 19.
- 20. public void setGear(int newValue) {
- 21. gear = newValue;
- 22. }
- 23.
- 24. public void applyBrake(int decrement) {
- 25. speed -= decrement;
- 26. }
- 27.
- 28. public void speedUp(int increment) {
- 29. speed += increment;
- 30. }
- 31.
- 32.}
- public class Bicycle {
-
- //Bicycle类有三个属性
- public int cadence;
- public int gear;
- public int speed;
-
- //Bicycle类有一个构造方法
- public Bicycle(int startCadence, int startSpeed, int startGear) {
- gear = startGear;
- cadence = startCadence;
- speed = startSpeed;
- }
-
- //Bicycle有四个方法
- public void setCadence(int newValue) {
- cadence = newValue;
- }
-
- public void setGear(int newValue) {
- gear = newValue;
- }
-
- public void applyBrake(int decrement) {
- speed -= decrement;
- }
-
- public void speedUp(int increment) {
- speed += increment;
- }
-
- }
复制代码 声明一个MountainBike类是Bicycle的子类:
Java代码- 1.public class MountainBike extends Bicycle {
- 2.
- 3. // the MountainBike subclass adds one field
- 4. public int seatHeight;
- 5.
- 6. // the MountainBike subclass has one constructor
- 7. public MountainBike(int startHeight, int startCadence, int startSpeed, int startGear) {
- 8. super(startCadence, startSpeed, startGear);
- 9. seatHeight = startHeight;
- 10. }
- 11.
- 12. // the MountainBike subclass adds one method
- 13. public void setHeight(int newValue) {
- 14. seatHeight = newValue;
- 15. }
- 16.
- 17.}
- public class MountainBike extends Bicycle {
-
- // the MountainBike subclass adds one field
- public int seatHeight;
- // the MountainBike subclass has one constructor
- public MountainBike(int startHeight, int startCadence, int startSpeed, int startGear) {
- super(startCadence, startSpeed, startGear);
- seatHeight = startHeight;
- }
-
- // the MountainBike subclass adds one method
- public void setHeight(int newValue) {
- seatHeight = newValue;
- }
- } MountainBike
复制代码 继承了Bycycle的所有属性和方法,并且增加了一个属性seatHeight和一个方法.除了构造方法,你就想重新写了一个完整的包含4个属性5个方法的类.如果Bycycle类的方法非常复杂并且需要花大量时间调试,那这样做是非常有价值的.
你能在子类里做什么
不管子类在哪个包里,一个子类从父类继承所有的public和protected成员.如果子类跟父类在相同的包(package)中,他也继承具有包权限的成员.你可以使用,覆盖,改写这些成员:
•继承的属性可以想其他属性一样直接使用.
•可以声明一个与继承的属性同名的属性来隐藏(hidding)继承的属性(不推荐)
•可以声明一个父类中没有的属性
•继承的方法可以直接使用
•可以写一个新的方法与继承的方法有相同的标签来重写(overriding)它.
•可以写一个静态(static)方法与继承的方法具有相同的标签来隐藏(hidding)它.
•你可以声明一个新的方法.
•可以在子类的构造方法中调用父类的构造方法,隐式或者用关键字super.
下面的部分将扩展这些话题.
父类中的私有成员
子类不会继承父类中的私有成员.然而,如果父类中有public或者protected方法访问了它的私有属性,那些方法仍然是可以使用的.
一个对它的封装类具有全部的访问权限,即使是私有成员.那么一个public或者protected的嵌套类被某个类继承,这个类对封装类的所有成员都具有间接的访问权限.
对象转换
如果我们写
Java代码- 1.public MountainBike myBike = new MountainBike();
- public MountainBike myBike = new MountainBike();
复制代码 那么myBike是MountainBike类型的.
MountainBike是Bicycle类和Object类的后代.所以,一个MountainBike是一个Bicycle也是一个Object,他可以被用在所有Bicycle或者Object类型的的地方.
反过来就不一定是对的了:一个Bicycle可能是一个MountainBike,也可能不是.转换(Casting)展示了一种类型替代另一种类型的用法,例如:- Object obj = new MountainBike();
复制代码 obj既是一个Object,也是一个MountainBike.这叫做隐式转换.
另一方面,我们写- MountainBike myBike = obj;
复制代码 我们将会得到一个编译时错误,因为编译器不知道obj是一个MountainBike.然而,我们可以用现实类型转换告诉编译器我们保证给obj赋值的MountainBike:
- MountainBike myBike = (MountainBike)obj;
复制代码 这种转换将对obj的赋值插入一个运行时检查(runtime check)让编译器能够安全地认为obj是一个MountainBike.如果obj在运行时不是一个MountainBike,将抛出一个异常.
注意:你可以用instanceof操作符测试一个特定对象的类型.可以让你避免因为一个不合适的转换而发生运行时错误.例如:- if (obj instanceof MountainBike) {
- MountainBike myBike = (MountainBike)obj;
- }
复制代码 |
|