Java的方法覆盖与变量覆盖_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java的方法覆盖与变量覆盖

Java的方法覆盖与变量覆盖

 2013/9/28 12:49:01  shinepaopao  程序员俱乐部  我要评论(0)
  • 摘要:首先,我们看看关于重载,和覆盖(重写)的简明定义:方法重载:如果有两个方法的方法名相同,但参数不一致,哪么可以说一个方法是另一个方法的重载。方法覆盖:如果在子类中定义一个方法,其名称、返回类型及参数签名正好与父类中某个方法的名称、返回类型及参数签名相匹配,那么可以说,子类的方法覆盖了父类的方法我们重点说说覆盖问题,以如下代码为例:publicclassPeople{publicStringgetName(){return"people";}
  • 标签:方法 Java

首先,我们看看关于重载,和覆盖(重写)的简明定义:

方法重载:如果有两个方法的方法名相同,但参数不一致,哪么可以说一个方法是另一个方法的重载。

方法覆盖:如果在子类中定义一个方法,其名称、返回类型及参数签名正好与父类中某个方法的名称、返回类型及参数签名相匹配,那么可以说,子类的方法覆盖了父类的方法

我们重点说说覆盖问题,以如下代码为例:

    class="dp-j">
  1. public?class?People?{ ?
  2. ????public?String?getName()?{ ?
  3. ????????return?"people"; ?
  4. ????} ?
  5. ?
  6. } ?
  7. public?class?Student?extends?People?{ ?
  8. ???? ?
  9. ????public?String?getName()?{ ?
  10. ????????return?"student"; ?
  11. ????} ?
  12. ???? ?
  13. } ?
  14. public?static?void?main(String[]?args)?{ ?
  15. ? People?p=new?People(); ?
  16. ??System.out.println(p.getName());//运行结果为people ?
  17. ?? ?
  18. ? Student?s=new?Student(); ?
  19. ??System.out.println(s.getName());//运行结果为student ?
  20. ?? ?
  21. ??People?pp=new?Student(); ?
  22. ??System.out.println(pp.getName());//运行结果为student ?
  23. ?
  24. ????}?

上述结果说明:student类的getName方法成功覆盖了父类的方法

我们再来看看变量的覆盖:

  1. public?class?People?{ ?
  2. ????protected?String?name="people"; ?
  3. ?
  4. ???? ?
  5. } ?
  6. public?class?Student?extends?People?{ ?
  7. ???? ?
  8. ????protected?String?name="student"; ?
  9. ???????? ?
  10. } ?
  11. public?static?void?main(String[]?args)?{ ?
  12. ???????? ?
  13. ???????????????? ?
  14. ????????People?p=new?People(); ?
  15. ????????System.out.println(p.name);//运行结果为people ?
  16. ???????? ?
  17. ????????Student?s=new?Student(); ?
  18. ????????System.out.println(s.name);//运行结果为student ?
  19. ???????? ?
  20. ????????People?pp=new?Student(); ?
  21. ????????System.out.println(pp.name);//运行结果为people ?
  22. ?
  23. ????}?

通过运行结果我发现:变量的覆盖实际上与方法的不尽相同。

我自己的话说:变量的覆盖最多只能算是半吊子的覆盖。

要不然,向上转换与不会发生数据丢失现象

  1. People?pp=new?Student(); ?
  2. System.out.println(pp.name);//运行结果为people?

就我个人的经验来说:变量的覆盖很容易让人犯错误.让人感觉又回到了C++的继承[这里不是指C++带virtual的继承]

最后我们再来看一段代码:

  1. public?class?People?{ ?
  2. ????protected?String?name="people"; ?
  3. ????public?String?getName()?{ ?
  4. ????????return?name; ?
  5. ????} ?
  6. } ?
  7. public?class?Student?extends?People?{ ?
  8. ???? ?
  9. ????protected?String?name="student"; ?
  10. ????public?String?getName()?{ ?
  11. ????????return?name; ?
  12. ????} ?
  13. } ?
  1. main(String[]?args)?{ ?
  2. ???????? ?
  3. ????????People?p=new?People(); ?
  4. ????????System.out.println(p.getName());//运行结果为people ?
  5. ???????? ?
  6. ????????Student?s=new?Student(); ?
  7. ????????System.out.println(s.getName());//运行结果为student ?
  8. ???????? ?
  9. ????????People?pp=new?Student(); ?
  10. ????????System.out.println(pp.getName());//运行结果为student ?
  11. ?
  12. ????}?

显然,如此的覆盖,才是对我们更有用的覆盖,因为这样才能达到:把具体对象抽象为一般对象的目的,实同多态性

以上只是我个人的看法,有不对的地方欢迎指出来讨论。

发表评论
用户名: 匿名