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);
java中static方法不能被重寫但是能重定義
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("構造程式碼塊執行了