浅谈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)CzsPx

51Testing软件测试网"G/Nv3n/IT"W

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

Sv)s.v&q#i051Testing软件测试网i#y'Q8Z!I&\}"?3gD$@

8lL9_)t W)l;dZ0  上述结果说明:student类的getName方法成功覆盖了父类的方法

efsbKM0 51Testing软件测试网s p? c/x

  我们再来看看变量的覆盖:51Testing软件测试网J3zu x3R4I7u

51Testing软件测试网[A1U6r KCo Q

51Testing软件测试网2fh+\@Vx8l}

  1. public class People {  
  2.     protected String name="people";  
  3.       
  4. }  
  5. public class Student extends People {  
  6.       
  7.     protected String name="student";  
  8.           
  9. }  
  10. public static void main(String[] args) {  
  11.           
  12.                   
  13.         People p=new People();  
  14.         System.out.println(p.name);//运行结果为people  
  15.           
  16.         Student s=new Student();  
  17.         System.out.println(s.name);//运行结果为student  
  18.           
  19.         People pp=new Student();  
  20.         System.out.println(pp.name);//运行结果为people  
  21.     }
51Testing软件测试网 S0o2u Dp.w(A2A CF

.s D/z] J0 51Testing软件测试网@B$f7Y6j,cB]

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

T.S CZ&L.Z0
 用我自己的话说:变量的覆盖最多只能算是半吊子的覆盖。

%X n:{/w m&|0  要不然,向上转换与不会发生数据丢失现象51Testing软件测试网jG/CNj)U&j

51Testing软件测试网 qh0NE\+yLe

51Testing软件测试网9KwrV5k+nW,dU

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

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

  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. }
51Testing软件测试网-LJ0u|$R%a(]

51Testing软件测试网5f_ m%x1C7WYxUT

51Testing软件测试网&rD+dj:_0s)y3Z

vKg?tzqE${}7mX0
  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.     }
51Testing软件测试网@l&Hl~6cU

51Testing软件测试网+rm8_9j/]} N

51Testing软件测试网M*h6S2F;`,}[p6JfM

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

%At"eT SX4k}Y s }0 51Testing软件测试网+Qz dAj ?d w

  以上只是我个人的看法,有不对的地方欢迎指出来讨论。51Testing软件测试网av YoD-k p$dTr/E;z


TAG:

 

评分:0

我来说两句

Open Toolbar