【转载】类继承时方法覆盖问题。(static方法不能被”覆盖“)
(2014-04-03 17:51:17)对于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”修饰的方法是静态绑定的,所以他们修饰的方法不能实现多态,当然不需要被子类覆盖了(子类覆盖父类方法是为了实现多态)。而其他的方法在运行时动态绑定。 同时,所有的变量也都是静态绑定的。
看个简单的例子:
- package com.Test;
- public class StaticTest {
- public static void main(String[] args) {
- A a = new B();
- a.f1();
- a.f2();
- }
- }
- class A {
- public static void f1() {
- System.out.println("hello! A");
- }
- public void f2() {
- System.out.println("hello ! A");
- }
- }
- class B extends A {
- public static void f1() {
- System.out.println("hello! B");
- }
- public void f2() {
- System.out.println("hello! B");
- }
- }
output: hello!A
hello!B
补充一句:在类继承中,方法分为覆盖和隐藏,而类中的变量则都是隐藏的,即变量(不管是静态变量还是普通变量)都是跟类绑定的。