免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1560 | 回复: 0
打印 上一主题 下一主题

官方教程:继承之概述(6) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-28 11:02 |只看该作者 |倒序浏览
官方教程:继承之概述(6)








在前面的课程中,你多次看到继承被提及.在java语言中,类可以派生于其它的类,包括其它类中的属性和方法.



声明:

继承类叫做子类(也叫做派生类,扩展类).被继承的类叫做超类(也叫做基类,父类).

除了Object没有父类,其它的类都有且只有一个父类(单继承).在定义一个类时若没有父类,则隐含继承Object,每一个类都是Object类的子类.



继承的思想是简单并且强大的:当你想创建一个新类,并且已经存在的类中有你想要的代码,你可以从已经存在的类派生出新类.



一个子类从父类继承所有的成员(members).构造函数不是成员,所以不被继承,但是可以在子类中调用父类构造方法.



Java平台的类继承
在java.lang包中的Object类定义并且实现了所有类的共同行为.在Java平台,大多数类直接派生与Object类,下面是类继承结构.






Object类是通用的,在继承结构的最顶端.靠近底端的类则提供更加具体的行为.


一个继承的例子

Java代码
  1. 1.public class Bicycle {   
  2. 2.      
  3. 3.    //Bicycle类有三个属性   
  4. 4.    public int cadence;   
  5. 5.    public int gear;   
  6. 6.    public int speed;   
  7. 7.      
  8. 8.    //Bicycle类有一个构造方法   
  9. 9.    public Bicycle(int startCadence, int startSpeed, int startGear) {   
  10. 10.        gear = startGear;   
  11. 11.        cadence = startCadence;   
  12. 12.        speed = startSpeed;   
  13. 13.    }   
  14. 14.      
  15. 15.    //Bicycle有四个方法   
  16. 16.    public void setCadence(int newValue) {   
  17. 17.        cadence = newValue;   
  18. 18.    }   
  19. 19.      
  20. 20.    public void setGear(int newValue) {   
  21. 21.        gear = newValue;   
  22. 22.    }   
  23. 23.      
  24. 24.    public void applyBrake(int decrement) {   
  25. 25.        speed -= decrement;   
  26. 26.    }   
  27. 27.      
  28. 28.    public void speedUp(int increment) {   
  29. 29.        speed += increment;   
  30. 30.    }   
  31. 31.      
  32. 32.}  
  33. public class Bicycle {
  34.        
  35.     //Bicycle类有三个属性
  36.     public int cadence;
  37.     public int gear;
  38.     public int speed;
  39.        
  40.     //Bicycle类有一个构造方法
  41.     public Bicycle(int startCadence, int startSpeed, int startGear) {
  42.         gear = startGear;
  43.         cadence = startCadence;
  44.         speed = startSpeed;
  45.     }
  46.        
  47.     //Bicycle有四个方法
  48.     public void setCadence(int newValue) {
  49.         cadence = newValue;
  50.     }
  51.        
  52.     public void setGear(int newValue) {
  53.         gear = newValue;
  54.     }
  55.        
  56.     public void applyBrake(int decrement) {
  57.         speed -= decrement;
  58.     }
  59.        
  60.     public void speedUp(int increment) {
  61.         speed += increment;
  62.     }
  63.        
  64. }
复制代码
声明一个MountainBike类是Bicycle的子类:

Java代码
  1. 1.public class MountainBike extends Bicycle {   
  2. 2.      
  3. 3.    // the MountainBike subclass adds one field   
  4. 4.    public int seatHeight;   
  5. 5.  
  6. 6.    // the MountainBike subclass has one constructor   
  7. 7.    public MountainBike(int startHeight, int startCadence, int startSpeed, int startGear) {   
  8. 8.        super(startCadence, startSpeed, startGear);   
  9. 9.        seatHeight = startHeight;   
  10. 10.    }      
  11. 11.      
  12. 12.    // the MountainBike subclass adds one method   
  13. 13.    public void setHeight(int newValue) {   
  14. 14.        seatHeight = newValue;   
  15. 15.    }      
  16. 16.  
  17. 17.}  
  18. public class MountainBike extends Bicycle {
  19.        
  20.     // the MountainBike subclass adds one field
  21.     public int seatHeight;

  22.     // the MountainBike subclass has one constructor
  23.     public MountainBike(int startHeight, int startCadence, int startSpeed, int startGear) {
  24.         super(startCadence, startSpeed, startGear);
  25.         seatHeight = startHeight;
  26.     }       
  27.        
  28.     // the MountainBike subclass adds one method
  29.     public void setHeight(int newValue) {
  30.         seatHeight = newValue;
  31.     }       

  32. } MountainBike
复制代码
继承了Bycycle的所有属性和方法,并且增加了一个属性seatHeight和一个方法.除了构造方法,你就想重新写了一个完整的包含4个属性5个方法的类.如果Bycycle类的方法非常复杂并且需要花大量时间调试,那这样做是非常有价值的.



你能在子类里做什么
不管子类在哪个包里,一个子类从父类继承所有的public和protected成员.如果子类跟父类在相同的包(package)中,他也继承具有包权限的成员.你可以使用,覆盖,改写这些成员:

•继承的属性可以想其他属性一样直接使用.
•可以声明一个与继承的属性同名的属性来隐藏(hidding)继承的属性(不推荐)
•可以声明一个父类中没有的属性
•继承的方法可以直接使用
•可以写一个新的方法与继承的方法有相同的标签来重写(overriding)它.
•可以写一个静态(static)方法与继承的方法具有相同的标签来隐藏(hidding)它.
•你可以声明一个新的方法.
•可以在子类的构造方法中调用父类的构造方法,隐式或者用关键字super.

下面的部分将扩展这些话题.



父类中的私有成员
子类不会继承父类中的私有成员.然而,如果父类中有public或者protected方法访问了它的私有属性,那些方法仍然是可以使用的.



一个对它的封装类具有全部的访问权限,即使是私有成员.那么一个public或者protected的嵌套类被某个类继承,这个类对封装类的所有成员都具有间接的访问权限.



对象转换
如果我们写

Java代码
  1. 1.public MountainBike myBike = new MountainBike();  
  2. public MountainBike myBike = new MountainBike();
复制代码
那么myBike是MountainBike类型的.



MountainBike是Bicycle类和Object类的后代.所以,一个MountainBike是一个Bicycle也是一个Object,他可以被用在所有Bicycle或者Object类型的的地方.



反过来就不一定是对的了:一个Bicycle可能是一个MountainBike,也可能不是.转换(Casting)展示了一种类型替代另一种类型的用法,例如:
  1. Object obj = new MountainBike();
复制代码
obj既是一个Object,也是一个MountainBike.这叫做隐式转换.



另一方面,我们写
  1. MountainBike myBike = obj;
复制代码
我们将会得到一个编译时错误,因为编译器不知道obj是一个MountainBike.然而,我们可以用现实类型转换告诉编译器我们保证给obj赋值的MountainBike:

  1. MountainBike myBike = (MountainBike)obj;
复制代码
这种转换将对obj的赋值插入一个运行时检查(runtime check)让编译器能够安全地认为obj是一个MountainBike.如果obj在运行时不是一个MountainBike,将抛出一个异常.



注意:你可以用instanceof操作符测试一个特定对象的类型.可以让你避免因为一个不合适的转换而发生运行时错误.例如:
  1. if (obj instanceof MountainBike) {
  2.    MountainBike myBike = (MountainBike)obj;
  3. }
复制代码

classes-object.gif (5.08 KB, 下载次数: 3)

classes-object.gif
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP