静态隐藏与覆盖的不同

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

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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 class Fu {
  public String a="fu";
  public void ordinaryMethod() {
    System.out.println("Fu ordinaryMethod");
    
  }
  public static void staticMethod() {
    System.out.println("Fu static method");
  }

}
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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();//使用类名直接访问 } }
package com.mosang.staticInheri;

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

}

输出如下:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Fu static method
Fu static method
Fu static method Fu static method
Fu static method
Fu static method

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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 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"); //与父类相同的静态方法(方法名、返回值、参数均相同)
  }

}

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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 } }
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
  }

}

输出结果

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Zi ordinaryMethod
Fu static method
Zi ordinaryMethod
Zi static method
Zi ordinaryMethod Fu static method Zi ordinaryMethod Zi static method
Zi ordinaryMethod
Fu static method
Zi ordinaryMethod
Zi static method

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

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

 >>



© 2009-2024 MOSANG.NET DESIGNED BY HEIRY