一道有關類載入 多型知識點的題目

2021-10-25 21:22:18 字數 923 閱讀 5155

下面**的輸出是什麼?

public class base

public void callname()

static class sub extends base

}public static void main(string args)

}

輸出的結果是:null

想要理解其中的緣由需要弄懂兩個前置知識點

其一類的載入順序

(1) 父類靜態**塊(包括靜態初始化塊,靜態屬性,但不包括靜態方法)

(2) 子類靜態**塊(包括靜態初始化塊,靜態屬性,但不包括靜態方法 )

(3) 父類非靜態**塊( 包括非靜態初始化塊,非靜態屬性 )

(4) 父類建構函式

(5) 子類非靜態**塊 ( 包括非靜態初始化塊,非靜態屬性 )

(6) 子類建構函式

其中:類中靜態塊按照宣告順序執行,並且(1)和(2)不需要呼叫new類例項的時候就執行了(意思就是在類載入到方法區的時候執行的)

其二還需要明白子類覆蓋父類方法,也就是方法重寫實現多型。

base b = new sub();它為多型的一種表現形式,宣告是base,實現是sub類, 理解為 b 編譯時表現為base類特性,執行時表現為sub類特性。

分析一下程式的執行過程:

執行 base b = new sub();語句時,載入父類的構造方法,並執行其中的callname()方法。因為子類覆蓋父類的原因,執行的並不是base中的callname()方法,而是子類重寫過的callname()方法。又因為類的載入順序緣故,此時只執行到了(4),(5)子類非靜態**塊還未執行,所以sub中的basename為null,即列印結果為null。

Java類載入的一道筆試題目

class a public a class b extends a public b public class test 輸出 abxy xy 執行過程 a ab new b 執行時候第一使用到a b類,jvm發現沒有載入a b的資訊,故先載入,由於b繼承了a類,所以會先載入a再載入b,在載入的過...

一道關於載入順序的題目分析

package com.gt.world.oa.aaa author gt public class test20140331 static public test20140331 string str private static int print string str public stati...

有關抽象類的知識點

抽象類 乙個類不知道他的子類的功能要怎麼實現,只是定義在那裡供子類自己實現 通過abstract來修飾這樣的類 作用 父類對子類有乙個約束和規定 子類能夠繼承現成的功能方法名 抽象方法 乙個方法用abstract修飾變成抽象方法,不能有方法體 特點 1.抽象類不能夠例項化物件,所以需要子類實現他,用...