方法的覆盖

【转载】类继承时方法覆盖问题。(static方法不能被”覆盖“)

 (2014-04-03 17:51:17)
   
  在看TIJ4的144页说: “覆盖”只有在某方法是基类的接口的一部分时才会出现。 即,必须能将一个对象向上转型为他的基本类型并调用相同的方法。 如果某方法是private(所有private方法都隐式地指定为final),他就不是基类接口的一部分。 自然就没有“覆盖”一说。   

       对于private方法,除了把它看成是因为他所归属的类的组织结构的原因而存在外,其他任何事物都不需要考虑到他。

====================================================================================================

在子类继承父类时,形构相同(返回值,方法名,参数都相同)的方法会被覆盖。  但这是有前提的,他针对的是实例方法,像static这样的方法就不能被”覆盖“。

     根据Java   Language   Specification  的描述,子类在继承父类时,对于方法而言,存在两种关系: 
     1.override即覆盖,这是对实例方法(instance   method)而言的;子类与父类中形构相同的方法会override父类中的那个方法。 

    2. hide  即隐藏,这是对类方法(class   method)即static方法而言的。如果子类中定义了静态方法,则它会隐藏父类中形构相同的所有方法,但如果隐藏了父类中的实例方法,则会编译报错。   

     根据上面的规定,“override覆盖”的前提是   实例方法,只有实例方法在继承时才会出现override情况。 如果是static方法,在继承时出现的现象根本就不能用“override”这个词描述,如果static方法在父类和子类中形构一致,则被成为 hide(隐藏)

那什么是隐藏呢?隐藏 :child隐藏了parent的变量和方法,那么,child实例就不能访问parent中被隐藏的变量或者方法,但是,将child实例向上提升转换成parent,可以访问parent中被隐藏的变量或者方法了。 我的理解是被隐藏的东西就是只和类绑定的东西。当子类继承父类,在子类对象中是访问不到父类中的被隐藏的东西的。因为这些东西只和父类绑定了。

      在从动态绑定的角度来看看这个覆盖问题,因为static方法是类方法,实现时是静态绑定的(引用“JAVA   核心技术   卷1   第六版”中149页内容“private、static、final”修饰的方法是静态绑定的,所以他们修饰的方法不能实现多态,当然不需要被子类覆盖了(子类覆盖父类方法是为了实现多态)。而其他的方法在运行时动态绑定。 同时,所有的变量也都是静态绑定的。

   看个简单的例子:

  1. package com.Test;  
  2.   
  3. public class StaticTest {  
  4.     public static void main(String[] args) {  
  5.         A a = new B();  
  6.         a.f1();  
  7.         a.f2();  
  8.     }  
  9. }  
  10.   
  11. class A {  
  12.   
  13.     public static void f1() {  
  14.         System.out.println("hello! A");  
  15.     }  
  16.   
  17.     public void f2() {  
  18.         System.out.println("hello ! A");  
  19.     }  
  20.       
  21. }  
  22.   
  23. class B extends A {  
  24.   
  25.     public static void f1() {  
  26.         System.out.println("hello! B");  
  27.     }  
  28.   
  29.     public void f2() {  
  30.         System.out.println("hello! B");  
  31.     }  
  32.       
  33. }  

output: hello!A

         hello!B

补充一句:在类继承中,方法分为覆盖和隐藏,而类中的变量则都是隐藏的,即变量(不管是静态变量还是普通变量)都是跟类绑定的。

原文地址:https://www.cnblogs.com/xuwangqi/p/11172160.html