1. 程式人生 > >Java在有繼承情況下初始化函式的呼叫

Java在有繼承情況下初始化函式的呼叫

廢話不多說,看下面的程式碼:

public class Son extends Father{
    int a = fun();
    public int fun(){
        System.out.println("son fun");
        return 1;
    }

    public static void main(String[] args) {
        new Son();
    }
}

class Father{
    int j = fun();
    public int fun(){
        System.out.println("Father fun"
); return 1; } }

很明顯,在Son類初始化時,要首先初始化父類Father , 那麼會首先初始化變數j,那麼問題來了,初始化j時呼叫的是哪一個fun函式呢?

解答

這要從Java方法呼叫來說,Java是一種靜態單分配,動態多分配的語言,也就是,當發生靜態繫結時(static函式、final函式、private函式(private被預設新增final屬性)、構造方法),會根據物件的外觀型別、引數的型別進行方法的繫結。當發生動態繫結時,則會根據物件的實際型別進行方法繫結。

通過javap檢視編譯後的位元組碼後也可得知,在初始化時兩個方法呼叫都是

invokevirtual   Method
:
fun()

這是動態分配,所以,會出現上面的結果。

相關推薦

Java繼承情況初始函式呼叫

廢話不多說,看下面的程式碼: public class Son extends Father{ int a = fun(); public int fun(){ System.out.println("son fun");

Java基礎-----繼承中的初始

前言 子類構造方法執行前預設先執行父類的無參構造方法。 一個類的初始化過程 成員變數進行初始化 (1)預設初始化。 (2)顯示初始化。 (3)構造方法初始化。 案例演示 package duixiang; class Fu { public int num = 1

C++單繼承、多繼承情況的虛擬函式表分析

C++的三大特性之一的多型是基於虛擬函式實現的,而大部分編譯器是採用虛擬函式表來實現虛擬函式,虛擬函式表(VTAB)存在於可執行檔案的只讀資料段中,指向VTAB的虛表指標(VPTR)是包含在類的每一個例項當中。當使用引用或指標呼叫虛擬函式時,首先通過VPTR找到VTAB,然後通過偏移量找到虛擬函式地址並呼叫。

Java類的各種成員初始順序如:父子類繼承時的靜態代碼塊,普通代碼塊,靜態方法,構造方法,等先後順

依次 成員初始化順序 main class 實例對象 變量 影響 {} 所在 class B extends A ,然後A類也就是父類裏面有靜態代碼塊,普通代碼塊,靜態方法,靜態成員變量,普通成員變量,普通方法。子類也是這樣,然後繼承之後,關於程序打印輸出的結果。涉及到Ja

Java初始函式

我們來考慮型別的裝載,連線和初始化 已經物件的生命週期。 可能出現在class檔案中的兩種編譯器產生的方法是: 例項初始化方法(名為<init>) 類與介面初始化方法(名為<clinit>)。 <clinit>方法依次執行如下語句:

Java繼承機制的初始順序+靜態動態繫結

 一個Java程式的執行要經過編譯和執行(解釋)這兩個步驟,同時Java又是面向物件的程式語言。當子類和父類存在同一個方法,子類重寫了父類的方法,程式在執行時呼叫方法是呼叫父類的方法還是子類的重寫方法呢,這應該是我們在初學Java時遇到的問題。這裡首先我們將確定這種呼叫何種

多重繼承關系初始順序及初始

java 所有 clas 屬性 配對 -- 如果 實現 硬盤 順序:父類屬性--> 父類構造方法--> 子類屬性--> 子類構造方法 初始化: 1.在創建類之前,檢查是否已加載檢查硬盤上的.class是否加載到內存中,如果沒有加載就先加載父類的文件,再加載

uploadify在chrome初始失敗,在Firefox卻可以原因探析

報錯 logs .com log 其他 原因 初始化 -1 參考 如果沒有報錯,在其他瀏覽器下沒問題,那就只有一種可能:瀏覽器flash加載失敗,解決辦法是,更改瀏覽器對站點flash的設置。參考下圖: uploadify在chrome下初始化失敗,在Firefox下卻

Java類、實例初始的順序

++ 變量 相關 obi 類加載的過程 經歷 過程 stat 布局 求如下 java 代碼的輸出?? class T implements Cloneable{ public static int k = 0; public static T t1 = ne

Java類與對象初始的過程(一道經典的面試題)

java語法 ade 還要 body image LV 賦值 準備 new t 本文不再以ClassLoader的視角解釋這些問題。 首先,Java代碼有個特點,就是成員變量可以在前面的方法中使用,在後面定義。這一特性,很多人說Java了不起,可是為什麽呢?Java為何能夠

OneExerciseOne創建一個類,它包含一個int域,一個char域,他們都沒有初始,驗證Java執行了默認初始

system println 驗證 初始化 容易 沒有 調用 消息 說明 在學習《Thinking In java》時,遇到Chapter 2的Exercise 1,問題是這麽說的“/**創建一個類,它包含一個int域,一個char域,他們都沒有初始化,將他們的值打印出來,

有關java類、對象初始的話題,從一道面試題切入

() 深入理解java 補充 [] base sna 字體 都是 spa 最近在整理東西時,剛好碰到以前看的一道有關java類、對象初始化相關題目,覺得答案並不是非常好(記憶點比較差,不是很連貫)。加上剛好復習完類加載全過程的五個階段(加載-驗證-準備-解析-初始化),所以

java類的載入與初始

https://blog.csdn.net/u013349237/article/details/71076617     1在命令列啟動虛擬機器jvm進行載入, 2用class.forname()方法進行動態載入; 3用ClassLoader.loadClass()進行動態載入

一段程式碼看懂Java類的載入和初始

先貼程式碼 class Base { int a = numa(); private static int c = numc(); static int b = numb(); static { System.out.println("Base:static code b

廖威雄: 思維導圖:利用__attribute__((section()))構建初始函式表與Linux核心init的實現

本文具體解說了利用__attribute__((section()))構建初始化函式表。以及Linux核心各級初始化的原理。 作者簡單介紹:     廖威雄,2016年本科畢業於暨南大學。眼下就職於珠海全志科技股份有限公司從事linu

如何在不改變函式情況,此函式加上新功能,用裝飾模式!

        最近專案上碰到一個需求,所有的伺服器與客戶端通訊的協議要加上時間戳的校驗,已防止使用者惡意修改時間。         我的天,現在的協議已經有50多條了,要改好多好多地方啊,有沒有什麼辦法在不改變原先函式的情況下

RT-Thread 讀後感2——建立執行緒(定義執行緒的棧,定義執行緒函式,定義執行緒控制塊,執行緒初始函式

1. 定義執行緒的棧 多執行緒作業系統中,每個執行緒都是獨立的,互不干擾,所以要為每個執行緒分配獨立的棧空間,這個棧空間通常是一個預先定義好的全域性陣列, 也可以是動態分配的一段記憶體空間,但它們都存在於 RAM 中。定義兩個執行緒棧如下: // 定義執行緒棧 大小設定為512 rt_ui

pytorch系列 -- 9 pytorch nn.init 中實現的初始函式 uniform, normal, const, Xavier, He initialization

本文內容: 1. Xavier 初始化 2. nn.init 中各種初始化函式 3. He 初始化 torch.init https://pytorch.org/docs/stable/nn.html#torch-nn-init 1. 均勻分佈 torch.nn.init.u

tf.get_variable 中變數初始函式和Xavier初始

當使用 tf.get_variable(name, shape=None, initializer=None) 來定義變數時,可以利用變數初始化函式來實現對 initializer 的賦值。 在神經網路中,最常權重賦值方式是 正態隨機賦值 和 Xavier賦值。 1. 變數初始

python-初始函式

#本次學習:初始化函式 #-*- coding:utf-8 -*- class SeniorTestingEngineer: #初始化函式,在建立物件的時候就設定初始值 def __init__(self,name,work_year,salary): self.work_yea