静态隐藏与覆盖的不同

By heiry on 2019-08-04 [ in 技术 ]

java中,静态方法属于类,直接使用”类名.静态方法”方式访问,也可以通过”实例.方法”访问,后者一般不推荐,但是也是合法的:

package com.mosang.staticInheri;

public class Fu {
  public String a="fu";
  public void ordinaryMethod() {
    System.out.println("Fu ordinaryMethod");
    
  }
  public static void staticMethod() {
    System.out.println("Fu static method");
  }

}
package com.mosang.staticInheri;

public class Demo {
  public static void main(String[] args) {
    Fu f=new Fu();
    f.staticMethod();//使用实例方式访问
    Fu.staticMethod();//使用类名直接访问
  }

}

输出如下:

Fu static method
Fu static method

需要注意的是,在存在静态方法情况下的继承,静态方法不能被子类覆盖,即使子类有与父类相同的静态方法(同覆盖规则),也不是覆盖重写,如有Zi类继承如下:

package com.mosang.staticInheri;

public class Zi extends Fu{
  public String a="zi";
  public void ordinaryMethod() {
    System.out.println("Zi ordinaryMethod"); //实例方法,覆盖重写
    
  }
  public static void staticMethod() {
    System.out.println("Zi static method"); //与父类相同的静态方法(方法名、返回值、参数均相同)
  }

}

通过两种方式创建子类实例:

package com.mosang.staticInheri;

public class Demo {
  public static void main(String[] args) {
    Fu f1=new Zi();//多态方式创建对象
    Zi f2=new Zi();//普通方式创建对象
    f1.ordinaryMethod(); //输出Zi ordinaryMethod
    f1.staticMethod();//输出Fu static method
    f2.ordinaryMethod();//Zi ordinaryMethod
    f2.staticMethod();//Zi static method
  }

}

输出结果

Zi ordinaryMethod
Fu static method
Zi ordinaryMethod
Zi static method

从上输出结果可看到,父类的静态方法并不能被覆盖,只是被隐藏。

同样,静态成员变量也是一样的道理。出现相同静态字段时父类字段不会将子类字段覆盖,而只是将其“隐藏”。

 >>



© 2009-2021 MOSANG.NET DESIGNED BY HEIRY