1. 程式人生 > >Java 靜態方法在繼承時的表現

Java 靜態方法在繼承時的表現

靜態方法在繼承時的情況

如果在父類定義了靜態方法,子類對父類進行繼承的時候,可以繼承靜態方法,但是在子類中表現為隱藏狀態。

靜態方法有兩種呼叫方式:

  1. 在使用 類名.靜態方法 呼叫的時候,直接呼叫的是各自類的靜態方法;
  2. 使用物件引用進行靜態方法呼叫時候,會呼叫該引用所屬類別的靜態方法;如果子類的引用且子類中沒有定義所呼叫的靜態方法,則會呼叫從父類繼承來的靜態方法(在子類中表現為引用)。
import java.io.IOException;

class A{
    public static String staticStr= "A的靜態屬性" ;
    public String nonstaticStr = "A的非靜態屬性"
; public static void staticMethod(){ System.out.println("A的靜態方法"); } public void nonStaticMethod(){ System.out.println("A的非靜態方法"); } } class B extends A{ // public static String statictaticStr= "B的靜態屬性" ; public String nonstaticStr = "B的非靜態屬性" ; // public static void staticMethod(){
// System.out.println("B的靜態方法"); // } public void nonStaticMethod(){ System.out.println("B的非靜態方法"); } } class C extends A{ } public class test1 { public static void main(String[] args) throws IOException { A a = new B(); System.out.println(a.staticStr); System.out.println(a.nonstaticStr); a.staticMethod(); a.nonStaticMethod(); System.out.println("####################"
); C c = new C(); System.out.println(c.staticStr); System.out.println(c.nonstaticStr); c.nonStaticMethod(); System.out.println("####################"); B b = new B(); System.out.println(b.staticStr); System.out.println(b.nonstaticStr); b.staticMethod(); b.nonStaticMethod(); } } /* A的靜態屬性 A的非靜態屬性 A的靜態方法 B的非靜態方法 #################### A的靜態屬性 A的非靜態屬性 A的非靜態方法 #################### A的靜態屬性 B的非靜態屬性 A的靜態方法 B的非靜態方法 */
import java.io.IOException;

class A{
    public static String staticStr= "A的靜態屬性" ;
    public String nonstaticStr = "A的非靜態屬性" ;
    public static void staticMethod(){
        System.out.println("A的靜態方法");
    }
    public void nonStaticMethod(){
        System.out.println("A的非靜態方法");
    }

}

class B extends A{
    public static String statictaticStr= "B的靜態屬性" ;
    public String nonstaticStr = "B的非靜態屬性" ;
    public static void staticMethod(){
        System.out.println("B的靜態方法");
    }
    public void nonStaticMethod(){
        System.out.println("B的非靜態方法");
    }
}

class C extends A{

}
public class test1 {

    public static void main(String[] args) throws IOException {
        A a = new B();
        System.out.println(a.staticStr);
        System.out.println(a.nonstaticStr);
        a.staticMethod();
        a.nonStaticMethod();

        System.out.println("####################");
        C c = new C();
        System.out.println(c.staticStr);
        System.out.println(c.nonstaticStr);
        c.nonStaticMethod();

        System.out.println("####################");
        B b = new B();
        System.out.println(b.staticStr);
        System.out.println(b.nonstaticStr);
        b.staticMethod();
        b.nonStaticMethod();
    }
}


/*
A的靜態屬性
A的非靜態屬性
A的靜態方法
B的非靜態方法
####################
A的靜態屬性
A的非靜態屬性
A的非靜態方法
####################
A的靜態屬性
B的非靜態屬性
B的靜態方法
B的非靜態方法
*/