java 继承调用_【JAVA学习】继承中函数调用机制
類(類的對(duì)象)在調(diào)用函數(shù)時(shí),究竟哪一個(gè)函數(shù)被調(diào)用,是存在特定的機(jī)制的,現(xiàn)在我們來梳理下其步驟。
步驟一:當(dāng)其調(diào)用一個(gè)函數(shù)的時(shí)候,編譯器根據(jù)其聲明的變量類型和調(diào)用的函數(shù)名字找到所有此“類”和其父類中具有同名的函數(shù)
Class A{public void getName(inta){
System.out.println("This is Class A and integer is " +a);
}
}
Class BextendsA{public void getName(inta){
System.out.println("This is Class B and integer is " +a);
}public void getName(doublea){
System.out.println("This is Class B and float number is " +a);
}public static voidmain(String[] args){
B b= newB();
b.getName(3.14);
A a = newB();
a.getName(3.14);
} }
首先,根據(jù)步驟一,變量b聲明的類型為B,其中與b調(diào)用函數(shù)同名的函數(shù)有兩個(gè),分別為getName(int a)和 getName(double a),同時(shí)A作為B的父類,有一個(gè)訪問修飾符為public,既子類可以訪問且與變量b同名的函數(shù)getName(int a)。此時(shí),經(jīng)過步驟一篩選之后,變量b所調(diào)用函數(shù)的候選者有如下幾個(gè):
A:
getName(inta)
B:
getName(inta)
getName(double a)
步驟二:編譯器根據(jù)傳入?yún)?shù)類型選擇最合適的函數(shù)。所以b最合適的函數(shù)為public void getName(double a)
步驟三:值得留意的是,如果此函數(shù)前有private , static ,final修飾或者方法是構(gòu)造函數(shù),根據(jù)靜態(tài)綁定(static binding)原則,根據(jù)其顯示聲明的變量類型可以直接確定所調(diào)用的函數(shù)。與之相對(duì)的是動(dòng)態(tài)綁定(dynamic binding),意思即是當(dāng)程序運(yùn)行時(shí),程序會(huì)
找到變量指向的實(shí)際對(duì)象,獲取其實(shí)際類型。再確定其調(diào)用的函數(shù)。
一個(gè)程序中,一般都會(huì)存在大量的函數(shù)調(diào)用,如果每一次調(diào)用都從零開始搜索,無疑會(huì)消耗大量的時(shí)間。因此,JVM會(huì)預(yù)先計(jì)算出每一個(gè)類的函數(shù)調(diào)用表(method table),如下所示
A:
getName(int ) -> A.getName(int)
B:
getName(int ) -> B.getName(int)
getName(double ) -> B.getName(int)
此表包含了每一個(gè)類可以調(diào)用的函數(shù)(無論其是自己的函數(shù)還是父類的函數(shù),只要調(diào)用都需要納入此表)。當(dāng)JVM確定了函數(shù)實(shí)際類型時(shí),按此表用以上步驟進(jìn)行查找調(diào)用。
總結(jié)
以上是生活随笔為你收集整理的java 继承调用_【JAVA学习】继承中函数调用机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android实现NCM转MP3格式
- 下一篇: 移动机顶盒cm211-1 刷机