浅谈Java的方法覆盖与变量覆盖
上一篇 /
下一篇 2012-04-12 11:22:23
/ 个人分类:Java
首先,我们看看关于重载,和覆盖(重写)的简明定义:
6} Z6x
F1]+M|0 方法重载:如果有两个方法的方法名相同,但参数不一致,哪么可以说一个方法是另一个方法的重载。
,D0f%o%N O!z0
51Testing软件测试网]&gBs-` \ 方法覆盖:如果在子类中定义一个方法,其名称、返回类型及参数签名正好与父类中某个方法的名称、返回类型及参数签名相匹配,那么可以说,子类的方法覆盖了父类的方法51Testing软件测试网
^c,z ES
51Testing软件测试网:n*{7w[;gZp 我们重点说说覆盖问题,以如下代码为例:51Testing软件测试网-i%v6Aa(QxYV?y/c
51Testing软件测试网"p)CzsPx51Testing软件测试网"G/N v3n/IT"W
- public class People {
- public String getName() {
- return "people";
- }
-
- }
- public class Student extends People {
-
- public String getName() {
- return "student";
- }
-
- }
- public static void main(String[] args) {
- People p=new People();
- System.out.println(p.getName());
-
- Student s=new Student();
- System.out.println(s.getName());
-
- People pp=new Student();
- System.out.println(pp.getName());
-
- }
|
Sv)s.v&q#i051Testing软件测试网i#y'Q8Z!I&\}"?3gD$@
8lL9_)t
W)l;dZ0 上述结果说明:student类的getName方法成功覆盖了父类的方法
efsbKM0
51Testing软件测试网s
p?
c/x 我们再来看看变量的覆盖:51Testing软件测试网J3zux3R4I7u
51Testing软件测试网[A1U6r KCo Q51Testing软件测试网2fh+\@Vx8l}
- public class People {
- protected String name="people";
-
-
- }
- public class Student extends People {
-
- protected String name="student";
-
- }
- public static void main(String[] args) {
-
-
- People p=new People();
- System.out.println(p.name);
-
- Student s=new Student();
- System.out.println(s.name);
-
- People pp=new Student();
- System.out.println(pp.name);
-
- }
|
51Testing软件测试网 S0o2u
Dp.w(A2ACF.s D/z]
J0
51Testing软件测试网@B$f7Y6j,cB] 通过运行结果我发现:变量的覆盖实际上与方法的不尽相同。
T.S CZ&L.Z0
用我自己的话说:变量的覆盖最多只能算是半吊子的覆盖。
%Xn:{/w m&|0 要不然,向上转换与不会发生数据丢失现象51Testing软件测试网jG/CNj)U&j
51Testing软件测试网
qh0NE\+yLe51Testing软件测试网9KwrV5k+nW,dU
- People pp=new Student();
- System.out.println(pp.name);
|
u SNKW-^0
n#}#tg$Dcg-gU0
51Testing软件测试网([n"n1Z\ 就我个人的经验来说:变量的覆盖很容易让人犯错误.让人感觉又回到了C++的继承[这里不是指C++带virtual的继承]
2AZ4LGuk&A|j0
*\2eI\2W~0 最后我们再来看一段代码:
'XR%r}(]G0
z
v5l1m;p o7c9_#H0jy-p[051Testing软件测试网.hx~Z_
_IR3yM
- public class People {
- protected String name="people";
- public String getName() {
- return name;
- }
- }
- public class Student extends People {
-
- protected String name="student";
- public String getName() {
- return name;
- }
- }
|
51Testing软件测试网-LJ0u|$R%a(]51Testing软件测试网5f_m%x1C7WYxUT
51Testing软件测试网&rD+d j:_0s)y3Zv Kg?tzqE${}7mX0
- main(String[] args) {
-
- People p=new People();
- System.out.println(p.getName());
-
- Student s=new Student();
- System.out.println(s.getName());
-
- People pp=new Student();
- System.out.println(pp.getName());
-
- }
|
51Testing软件测试网@l&Hl ~6cU51Testing软件测试网+rm8_9j/]}N
51Testing软件测试网M*h6S2F;`,}[p6JfM 显然,如此的覆盖,才是对我们更有用的覆盖,因为这样才能达到:把具体对象抽象为一般对象的目的,实同多态性
%A t"eT SX4k}Y
s}0
51Testing软件测试网+QzdAj ?d
w 以上只是我个人的看法,有不对的地方欢迎指出来讨论。51Testing软件测试网avYoD-k
p$dTr/E;z
收藏
举报
TAG: