zoukankan      html  css  js  c++  java
  • 方法的覆盖

    【转载】类继承时方法覆盖问题。(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

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

  • 相关阅读:
    vim替换
    vim 常用快捷键 二
    vim撤销
    让你提升命令行效率的 Bash 快捷键
    快速正确的安装 Ruby, Rails 运行环境
    STL的常用算法
    Ubuntu下Postfix邮件服务器安装及基本的设置
    vim 参考手册
    指针 多维数组 数组指针 指针数组
    数学小抄
  • 原文地址:https://www.cnblogs.com/xuwangqi/p/11172160.html
Copyright © 2011-2022 走看看