设为首页  
联系我们  
加入收藏  
网页制作 冲浪宝典 图形图像 操作系统 软件教学 编程开发 认证考试 安全技术 站长专区 文学驿站 娱乐天地 游戏天地 办公软件
文章搜索
您的位置: 首页 >> 文章首页 >> 网页制作 >> Javascript >> Java中的方法和变量在继承时的覆盖问题
精品推荐
Javascript点击TOP10
·菜鸟架设动网论坛全教程
·网页模板的使用方法 (教程)
·网页对联广告代码效果大全
·用JavaScript实现文件图片滚动效果
·图片循环滚动完美解决
·JS表格排序新法
·滚动的公告栏的实现
·模板使用教程:从切图到网页生成
·Javascript设计网页中的下拉菜单
·制作页面漂浮图片的效果
网页制作点击TOP10
·菜鸟架设动网论坛全教程
·网页模板的使用方法 (教程)
·网页对联广告代码效果大全
·初学者入门:如何学习网页制作?
·用JavaScript实现文件图片滚动效果
·常用CSS大全
·网页自动转向代码
·图片循环滚动完美解决
·DIV CSS网页布局实例解析:实现表格形式
·JS表格排序新法
精选专题

Java中的方法和变量在继承时的覆盖问题

作者: 来源:http://www.xgdown.com/ 时间:2007-7-19 13:07:47

Java中的方法和变量在继承时的覆盖问题(1)

想必你已经阅读了一两本这样的Java书籍,它们在开头都指出了面向对象编程的3个主要概念:封装、继承和多态。理解这3个概念对于领会Java 语言来说至关重要,而搞懂方法的覆盖又是理解继承概念的关键部分。

这个例子摘自 Java 语言规范

01:  class Super 
02:  { 
03:      static String greeting() 
04:      { 
05:         return "Goodnight"; 
06:      } 
07: 
08:      String name() 
09:      { 
10:         return "Richard"; 
11:      } 
12:  } 
 
01:  class Sub extends Super 
02:  { 
03:      static String greeting() 
04:      { 
05:         return "Hello"; 
06:      } 
07: 
08:      String name() 
09:      { 
10:         return "Dick"; 
11:      } 
12:  } 
 
01:  class Test 
02:  { 
03:      public static void main(String[] args) 
04:      { 
05:         Super s = new Sub(); 
06:         System.out.println(s.greeting() + ", " + s.name()); 
07:      } 
08:  }

运行 Test 类的结果如下

Goodnight, Dick

要是你得出了同样的输出结果,那么你或许对方法的覆盖有了较好的理解,如果你的结果和答案不一致,那就让我们一起找出原因,我们先分析一下各个类:Super类由方法 greeting和name组成,Sub 类继承了 Super 类,而且同样含有 greeting 和 name方法。Test 类只有一个 main方法。在 Test 类的第5 行中,我们创建了一个 Sub 类的实例。在这里,你必须明白的是:虽然变量 s的数据类型为 Super 类,但是它仍旧是 Sub 类的一个实例,如果你对此有些迷惑,那么可以这样理解: 变量s 是一个被强制转换为 Super 型的Sub 类的实例。

下一行(第 6 行)显示了s.greeting()返回的值,加上一个字符串,紧随其后的是 s.name()的返回值。关键问题就在这里,我们调用的到底是Super类的方法还是Sub类的方法,让我们首先判断调用的是哪个类的name()方法,两个类中的name()方法都不是静态方法,而是实例方法,因为Sub类继承了Super类,而且有一个和它父类同样标识的name()方法,所以Sub类中的name()

方法覆盖了Super类中的name()方法,那么前面提到的变量s又是Sub 类的一个实例,这样一来 s.name()的返回值就是“Dick”了。

至此,我们解决了问题的一半,现在我们需要判断被调用的greeting()方法究竟是Super类的还是Sub类的。需要注意的是,两个类中的greeting()方法都是静态方法,也称为类方法。尽管事实上Sub类的greeting()方法具有相同的返回类型、相同的方法名以及相同的方法参数。然而它并不覆盖Super类的greeting()方法,由于变量s被强制转换为Super型并且Sub类的greeting()方法没有覆盖Super类的greeting()方法,因此 s.greeting()的返回值为Goodnight。

共3页 9 7 [1] [2] [38 :>

Java中的方法和变量在继承时的覆盖问题 相关文章:
Java中的方法和变量在继承时的覆盖问题 相关软件:
特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
转载请注明来源:http://www.xgdown.com