java中,静态方法属于类,直接使用”类名.静态方法”方式访问,也可以通过”实例.方法”访问,后者一般不推荐,但是也是合法的:
package com.mosang.staticInheri;
public void ordinaryMethod() {
System.out.println("Fu ordinaryMethod");
public static void staticMethod() {
System.out.println("Fu static method");
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 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 static void main(String[] args) {
f.staticMethod();//使用实例方式访问
Fu.staticMethod();//使用类名直接访问
package com.mosang.staticInheri;
public class Demo {
public static void main(String[] args) {
Fu f=new Fu();
f.staticMethod();//使用实例方式访问
Fu.staticMethod();//使用类名直接访问
}
}
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
Fu static method
Fu static method
需要注意的是,在存在静态方法情况下的继承,静态方法不能被子类覆盖,即使子类有与父类相同的静态方法(同覆盖规则),也不是覆盖重写,如有Zi类继承如下:
package com.mosang.staticInheri;
public class Zi extends Fu{
public void ordinaryMethod() {
System.out.println("Zi ordinaryMethod"); //实例方法,覆盖重写
public static void staticMethod() {
System.out.println("Zi static method"); //与父类相同的静态方法(方法名、返回值、参数均相同)
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 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 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
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
}
}
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
Zi ordinaryMethod
Fu static method
Zi ordinaryMethod
Zi static method
从上输出结果可看到,父类的静态方法并不能被覆盖,只是被隐藏。
同样,静态成员变量也是一样的道理。出现相同静态字段时父类字段不会将子类字段覆盖,而只是将其“隐藏”。