首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

JAVA中步骤和变量在继承中的覆盖和隐藏

2012-08-25 
JAVA中方法和变量在继承中的覆盖和隐藏关键字: java继承 方法覆盖 方法隐藏?????? 我们知道,在JAVA中,子类

JAVA中方法和变量在继承中的覆盖和隐藏

关键字: java继承 方法覆盖 方法隐藏

?????? 我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种 情况,就是方法和变量在继承时的覆盖和隐藏问题,这些概念性的东西看似无聊,但是在面试或者是SCJP认证题中围绕这些是会经常碰到的,所以这里来讨论下

?

首先我们来看几个概念

?????? 隐藏?:child隐藏了parent的变量和方法,那么,child不能访问parent被隐藏的变量或者方法,但是,讲B转换成A中,可以访问A被隐藏的变量或者方法

??????? 覆盖?:child覆盖了parent的变量或者方法,那么,child不能访问parent被覆盖的变量或者方法,将child转换成parent后同样不能访问parent被覆盖的变量或者方法

?

首先看一下JAVA中方法和变量在继承时的覆盖和隐藏规则

?????? 1.父类的实例变量和静态变量能被子类的同名变量隐藏

?????? 2.父类的静态方法被子类的同名静态方法隐藏

?????? 3.父类的实例方法被子类的同名实例变量覆盖

?

还有几点需要注意的是

?????? 1.不能用子类的静态方法隐藏?父类中同样标示(也就是返回值 名字 参数都一样)的实例方法

?????? 2.不能用子类的实例方法覆盖?父类中同样标示的静态方法

?????? 3.这点儿请注意,就是变量只会被隐藏?不会被覆盖?,无论他是实例变量还是静态变量,而且,子类的静态变量可以隐藏?父类的实例变量,子类的实例变量可以隐藏?父类的静态变量

?

Java代码??JAVA中步骤和变量在继承中的覆盖和隐藏
  1. //父类??
  2. class?Parent??
  3. {??
  4. ????public?static?String?kind="javastudy.extendsstudy.parent";??
  5. ????public?static?int?age=50;??
  6. ????public?String?name="Parent";??
  7. ??
  8. ????//静态方法,返回包名??
  9. ????public?static?String?getKind()??
  10. ????{??
  11. ????????System.out.println("parent的getKind()方法被调用了");??
  12. ????????return?kind;??
  13. ????}??
  14. ????//静态方法,返回年龄??
  15. ????public?static?int?getAge()??
  16. ????{??
  17. ????????System.out.println("Parent的getAge()方法被调用了");??
  18. ????????return?age;??
  19. ????}??
  20. ??
  21. ????//实例方法,返回姓名??
  22. ????public?String?getName()??
  23. ????{??
  24. ????????System.out.println("Parent的getName()方法被调用了");??
  25. ????????return?this.name;??
  26. ????}??
  27. }??
  28. //子类??
  29. class?Child?extends?Parent??
  30. {??
  31. ????public?static?String?kind="javastudy.extendsstudy.child";??
  32. ????public?int?age=25;??
  33. ????public?String?name="child";??
  34. ??
  35. ????//隐藏父类静态方法??
  36. ????public?static?String?getKind()??
  37. ????{??
  38. ????????System.out.println("child的getkind()方法被调用了");??
  39. ????????return?kind;??
  40. ????}??
  41. ??????
  42. ????//获取父类包名??
  43. ????public?static?String?getParentKind()??
  44. ????{??
  45. ????????return?Parent.kind;??
  46. ????}??
  47. ??????
  48. ????//覆盖父类实例方法??
  49. ????public?String?getName()??
  50. ????{??
  51. ????????System.out.println("child的getName()被调用了");??
  52. ????????return?this.name;??
  53. ????}??
  54. ??????
  55. ????//获取父类名称??
  56. ????public?String?getParentName()??
  57. ????{??
  58. ????????return?super.name;??
  59. ????}??
  60. ????/*?
  61. ?????*错误,实例方法不能覆盖父类的静态方法?
  62. ????public?int?getAge()?
  63. ????{?
  64. ????????return?this.age;?
  65. ????}?
  66. ????*/??
  67. }??
  68. ??
  69. ??
  70. class?Test???
  71. {??
  72. ????public?static?void?main(String[]?args)???
  73. ????{??
  74. ????????Child?child=new?Child();??
  75. ????????System.out.printf("子类名称:%s,年龄:%d,包名:%s%n",child.name,child.age,child.kind);??
  76. ????????//输出:子类名称:child,年龄:25,包:javastudy.extendsstudy.child??
  77. ??
  78. ????????//把child转换成parent对象??
  79. ????????Parent?parent=child;??
  80. ??
  81. ????????System.out.printf("转换后的名称:%s,年龄:%d,包名:%s%n",parent.name,parent.age,parent.kind);??
  82. ????????//输出:转换后的名称:Parent,年龄:50,包:javastudy.extendsstudy.parent??
  83. ??
  84. ????????System.out.printf("子类访问父类被隐藏的实例变量name:%s%n",child.getParentName());??
  85. ????????//输出:子类访问父类被隐藏的实例变量name:Parent??
  86. ??????????
  87. ????????System.out.printf("子类访问父类被隐藏的静态变量kind:%s",child.getParentKind());??
  88. ????????//输出:子类访问父类被隐藏的静态变量kind:javastudy.extendsstudy.parent??
  89. ??
  90. ????????child.getName();??
  91. ????????//输出:child的getName()被调用了??
  92. ??
  93. ????????//**************注意看这个方法,返回的还是子类的getName??
  94. ????????parent.getName();??
  95. ????????//输出:child的getName()被调用了??
  96. ??
  97. ????????child.getKind();??
  98. ????????//输出:child的getkind()方法被调用了??
  99. ??
  100. ????????parent.getKind();??
  101. ????????//输出:parent的getKind()方法被调用了??
  102. ????}??
  103. }??
??

?好了,看了结果后总结下吧

?????? 1.同名的实例方法被覆盖?,同名的静态方法被隐藏?,child类的getName实例方法覆盖?了parent的getName实例方法,chind的getKind方法隐藏?了parent类的getKind方法

?????? 2.隐藏?和覆盖?的区别在于,子类对象转换成父类对象后,能够访问父类被隐藏?的变量和方法,而不能访问父类被覆盖?的方法

?????? 3.如果需要访问父类被隐藏?的实例变量,加上super就好了,比如访问父类的name,写上super.name就好了

热点排行