1. 程式人生 > >Java中的靜態方法能否被重寫?

Java中的靜態方法能否被重寫?

*非靜態方法屬於類的例項,是可以被子類重寫,從而達到多型的效果;
靜態方法屬於類,是不能被重寫,故而也不能實現多型。*

下面是具體的驗證過程

首先,定義一個超類A,裡邊定義一個靜態方法和一個非靜態方法:

public class A {
    public void unstaticMethod() {
        System.out.println("SuperClass unstaticMethod");
    }

    public static void staticMethod() {
        System.out.println("SuperClass staticMethod"
); } }

接下來,定義一個子類B,裡邊定義一個靜態方法和一個非靜態方法(形式上像是重寫了超類的方法):

public class B extends A {
    public void unstaticMethod() {
        System.out.println("SunClass unstaticMethod");
    }

    public static void staticMethod() {
        System.out.println("SunClass staticMethod");
    }
}

在接下來,我們進行測試:

public
class Test { @SuppressWarnings("static-access") public static void main(String[] args) { A a = new A(); A a2 = new B(); a.unstaticMethod(); a2.unstaticMethod(); a.staticMethod(); a2.staticMethod(); } }

執行結果:

SuperClass unstaticMethod
SunClass unstaticMethod
SuperClass staticMethod
SuperClass staticMethod

從執行結果,我們可以知道,對於非靜態方法,實現了多型的效果,而靜態方法卻沒有。

相關推薦

Java靜態方法能否重寫

*非靜態方法屬於類的例項,是可以被子類重寫,從而達到多型的效果; 靜態方法屬於類,是不能被重寫,故而也不能實現多型。* 下面是具體的驗證過程 首先,定義一個超類A,裡邊定義一個靜態方法和一個非靜態方法: public class A { publ

關於java父類靜態方法能否之類重寫的問題

1. 先說結論:   不能被重寫 2. 為什麼??   ②. 所引用該方法的物件指向的都是記憶體中同一塊記憶體的資料, 已經寫死了呀, 那你還怎麼重寫呢 3. 靜態方法可以直接用類名呼叫這麼方便,為什麼不都設定為靜態屬性和方法?   ①.靜態方法從屬於類, 可以通過類名直接呼叫, 在編譯

java靜態方法不能重寫(覆蓋)

靜態方法可以被繼承,但是,不能被覆蓋,即重寫。如果父類中定義的靜態方法在子類中被重新定義,那麼在父類中定義的靜態方法將被隱藏。可以使用語法:父類名.靜態方法呼叫隱藏的靜態方法。 如果父類中含有一個靜態

Java靜態屬性與靜態方法能否繼承的問題

開始正文之前的一個參考: 結論:java中靜態屬性和靜態方法可以被繼承,但是沒有被重寫(overwrite)而是被隱藏. 原因: 1). 靜態方法和屬性是屬於類的,呼叫的時候直接通過類名.方法名完成對,不需要繼承機制及可以呼叫。如果子類裡面定義了靜態方法和屬性,那麼

淺析java靜態方法,非靜態方法和構造方法的執行順序問題

https://blog.csdn.net/qq_42401622/article/details/81190406 對於java中的靜態方法,非靜態方法和構造方法的理解: 靜態方法是隨著的java中虛擬機器的類的載入而載入,是跟隨繫結在一起的。 public class Main{ s

java靜態方法和非靜態方法的區別

靜態方法和非靜態方法主要有兩個區別: 1.在外部呼叫靜態方法時,可以使用"類名.方法名"的方式,也可以使用"物件名.方法名"的方式。而例項方法只有後面這種方式。也就是說,呼叫靜態方法可以無需建立物件。 2.靜態方法在訪問本類的成員時,只允許訪問靜態成員(即靜態成員變數和靜態方法),而

java靜態方法為什麼不可以呼叫非靜態方法

重點:static關鍵字的修飾成員變數,成員方法和物件無關。 static修飾的內容是隨著類的載入而載入的,且只加載一次。 它儲存於一塊固定的記憶體區域(靜態區),所以,可以直接被類名呼叫。 它優先於物件存在,所以,可以被所有物件共享。     static可

java靜態方法為什麼不能使用this、super和直接呼叫非靜態方法

這個要從java的記憶體機制去分析,首先當你New 一個物件的時候,並不是先在堆中為物件開闢記憶體空間,而是先將類中的靜態方法(帶有static修飾的靜態函式)的程式碼載入到一個叫做方法區的地方,然後再在堆記憶體中建立物件。所以說靜態方法會隨著類的載入而被載入。當你new一個物件時,該物件存在於對

JAVA 靜態方法,非靜態方法,構造方法 ,執行順序

一直不能理解java 中這三者的執行順序。@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

javastatic方法不能重寫但是能重定義

1. static方法不能被重寫 如下例項會出現編譯錯誤:This instance method cannot override the static method from Animal 示例1: class Animal { public static void w

Java靜態方法不能重寫(詳解!)

答案很明確:java的靜態方法不能被重寫。 靜態成員(方法或屬性)是類的成員存放在棧中,類可以直接呼叫(是屬於類的靜態成員,當然物件也可以呼叫,只是說你可以使用而已);例項成員是物件的成員,存放在堆中,只能被物件呼叫。 重寫的目的在於根據創造物件的所屬型別

Java靜態屬性、靜態方法繼承重寫的那點破事

public class A { public static String staticStr = "A's static field"; public String nonStaticStr = "A's nonstatic field"

JAVA父類的靜態方法能否被子類重寫

靜態:   在編譯時所分配的記憶體會一直存在(不會被回收),直到程式退出記憶體才會釋放這個空間,在例項化之前這個方法就已經存在於記憶體,跟類的物件沒什麼關係。子類中如果定義了相同名稱的靜態方法,並不會重寫,而應該是在記憶體中又分配了一塊給子類的靜態方法,沒有重寫這一說,只是單純的名字重複了。  

java靜態代碼塊(static{...}),局部代碼塊(方法{...}),構造代碼塊(類{...})區別。

一個 什麽 控制 class 加載 我們 所有 變量 統一初始化 1、局部代碼塊:   格式:在方法中{局部代碼塊執行語句}   局部代碼塊,又叫普通代碼塊。它是作用在方法中的代碼塊。   作用:是控制變量的生命周期。   在程序中當我們定義完成一個局部變量x之後,並且在接

Java重寫後的方法重寫方法的返回值一樣嗎?

重寫方法的規則: 1、引數列表必須完全與被重寫的方法相同,否則不能稱其為重寫而是過載。 2、返回的型別必須一直與被重寫的方法的返回型別相同。 3、訪問修飾符的限制一定要大於被重寫方法的訪問修飾符(public>protected>default>private) 4、重寫方法一定不

java靜態變數,靜態程式碼塊,靜態方法,例項變數,匿名程式碼塊的載入順序

1. java中靜態變數,靜態程式碼塊,靜態方法,例項變數,匿名程式碼塊 在Java中,使用{}括起來的程式碼稱為程式碼塊,程式碼塊可以分為以下四種: (1)普通程式碼塊:就是類中方法的方法體 public void xxx(){ //code }

JAVA方法、抽象方法、例項方法靜態方法的辨別

抽象方法 抽象方法是用abstract修飾的方法,只能宣告不能實現,抽象方法必須被宣告在抽象類裡(反過來,抽象類裡不一定要有抽象方法),抽象方法的的作用就是強制子類實現該抽象方法(如果子類不是抽象類的話)。 例項方法 可以用物件引用呼叫的方法都可以稱作例項方法,例項方法必須在物件例項化之後,通過物件引用

Java方法重寫呼叫

上學期學了java,一個暑假沒有用,很多java的“精髓”都忘記了。週末在寫資料結構的作業的時候,要求寫一個迴圈連結串列的類,並且繼承之前寫的一個線性表的類。因為重寫的一些重要的東西忘記了,花了大量的時間一直在報空指標異常,終於發現了問題,並請教了前輩才算是解決了這個問題。

Java構造方法,程式碼塊,靜態塊的執行順序

class A{ public A(){ System.out.println("class A");//父類構造方法 } { System.out.println("I am A class ");//父類構造塊

java靜態變數,靜態方法靜態程式碼塊,構造程式碼塊,構造方法...執行順序

public class TestExeOrder { public TestExeOrder(){ System.out.println("類的構造方法執行了..."); } { System.out.println("構造程式碼塊執行了