java 調用對象的方法_JAVA調用對象方法的執行過程

JAVA調用對象方法的執行過程:

①.編譯器查看對象的聲明類型和方法名。假設調用x.f(parameter), ?且隱式參數x聲明為C類型的對象,有可能在C對象中存在多個參數類型和參數個數不同的f的方法{例如:f(int)、f(int,String)和f(String)},編譯器會一一列舉C類中的f方法和C的超類中聲明為public所有的f方法。

至此,編譯器已經獲得所有可能被調用的候選方法。

②.接下來,編譯器將查看調用方法時所提供的參數類型和參數個數。如果所有名為f的方法中存在這樣一個與提供方法的參數類型和參數個數完全匹配的方法,就選擇這個方法,這個過程也稱重載解析。例如:對于調用f(“This is my java”)來說,編譯器會尋找f(String)這個方法。如果編譯器沒有找到與參數類型和參數個數匹配的方法,或者經過類型轉換后有多個方法于此匹配,就會報告一個錯誤。

至此,已經尋找到需要調用的方法和參數類型

③.如果是此方法是被private、static、final修飾或則是構造器,那么編譯器可以準確的知道應該調用哪個方法,于是便調用這個的方法。這種調用方式叫著靜態綁定。靜態綁定方式于此結束。

而與此對應是,調用方法依賴于隱式參數的實際類型,并且在運行時實現動態綁定,編譯器采用動態綁定的方式會生成一條調用f(String)的指令(其原因請查看下面的動態綁定解析)。

④.當程序運行,并且采用動態綁定調用方法時,虛擬機一定調用與x所引用的對象的實際類型最適合的那個方法。假設x的實際類型是D,D是C的子類,如果D類定了方法f(String),編譯器就直接調用它,否則就在D類的超類C中尋找f(String)方法,如果C類型中不存在這個方法,則又到尋找C的超類中尋找這個方法,以此類推。這個過程就稱為動態綁定。

動態綁定解析:

每次調用方法時都要進行搜索,這樣一來,時間開銷相當大。因此,虛擬機預先為每一個類創建了一個方法表,其中列舉出了類中的所有方法簽名和實際調用的方法。而在真正調用方法的時候,虛擬機僅僅查找這個表就行了。在前面的列子中,虛擬機搜索D類的方法表。以便尋找與調用f(String)相匹配的方法。這個方法既可能是D.f(String),也可能是C.f(String),還有可能是*.f(String),這里的*是指D的超類。

----參考于《Core Java》

下面我們就舉一個簡單的例子:

新建一個Father類,并且讓Son類繼承Father基類:

package com.bin.bind;

public class TestBind {

public static void main(String[] args) {

String name = "TOM";

String hobby = "~~~sleep~~~";

int age = 19;

Father father = new Son(name, hobby, age);

String result = father.getAllInfo();

System.out.println(result);

}

}

class Father {

public Father(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public int getAge() {

return age;

}

public void setName(String name) {

this.name = name;

}

public void setAge(int age) {

this.age = age;

}

public String getAllInfo() {

return "姓名是:"+this.name+"\t年齡是:"+this.age;

}

private String name = null;

private int age = 0;

}

class Son extends Father {

public Son(String name, String hobby, int age) {

super(name, age);

setHobby(hobby);

}

public String getHobby() {

return hobby;

}

public void setHobby(String hobby) {

this.hobby = hobby;

}

public String getAllInfo() {

return "姓名是:"+super.getName()+"\t年齡是:"+

super.getName()+"\t愛好是:"+hobby;

}

private String hobby = null;

}

在Father和Son類中都存在getAllInfo()這個方法,因為getAllInfo()不是static、final、private、構造方法,所以此方法將采用動態綁定。

在程序執行的時候虛擬機會為這個兩個類生成方法表

Father類:

Father(String,int)->Father(String,int)

setAge(int)->Father.setAge(int)

getAge()->Father.getAge()

setName(String)->Father.setName(String)

getName()->Father.getName()

getAllInfo()->Father.getAllInfo()

Son類:

Father(String,int)->Father(String,int)

setAge(int)->Father.setAge(int)

getAge()->Father.getAge()

setName(String)->Father.setName(String)

getName()->Father.getName()

getAllInfo()->Father.getAllInfo()

Son(String,String,age)->Son(String,String,age)

setHobby(String)->Son.setHobby(String)

getHobby()->Son.getHobby()

getAllInfo()->Son.getAllInfo()

注意:上面列舉的方法并不完整,因為他們還都默認繼承了一個Object超類。

下面分析這條語句:

String result = father.getAllInfo();

father.getAllInfo()的解析過程如下:

①:虛擬機提取father類的實際類型的方法表。既可能是Father類也可能是Son類。(因為這里father引用所指向的是Son類的實例對象,所以實際類型必定是Son)

②:接下來,虛擬機搜索定義getAllInfo簽名的類,此時,虛擬機已經知道調用哪個方法。(Son中只有一個getAllInfo方法,且與此匹配,所以被調用) ③:虛擬機執行調用方法。(最后將返回結果賦值給result)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530145.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530145.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530145.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java類默認權限_Java 訪問權限控制以及類初始化順序

一. Package在一個項目中,不可以有相同的兩個包名package語句必須是文件中除注釋外第一句程序代碼,否則不能通過編譯。二. Java訪問權限概述類成員:對于一個類,其成員(包括成員變量和成員方法)能否被其他類所訪問,取決…

java http頭 字符串轉日期_springboot~DTO字符字段與日期字段的轉換問題

不會自動轉換string與date主要是這個意思,前端提交的JSON里,日期是一個字符串,而對應后端的實體里,它是一個Date的日期,這兩個在默認情況下是不能自動轉換的,我們先看一下實體實體public class UserDTO {pr…

java super extends_Java繼承和super的用法

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓繼承的關鍵字:extends格式如下: class 子類名 extends父類名{...}例如學生是繼承人類這一父類的.class student extends person{...}如果一個類的聲明沒有使用關鍵字extends,則這個類默認是繼承Object類的.Object是所有類的父類.Ob…

比較abc大小的java_比較abc大小java

比較abc大小java[2021-02-09 04:04:20] 簡介:php去除nbsp的方法:首先創建一個PHP代碼示例文件;然后通過“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推薦:《PH…

海天食品的java開發工作如何_再三個月就秋招了,我想找一份java開發工作,現在應該怎么準備一下?...

在找工作之前,大家都要做一些準備工作,java開發也是如此掌握核心JavaSE首先,從核心Java(JavaSE)開始學習,盡可能地掌握它。你應該了解和掌握一些基本概念,如循環,數組,運算符等等。此外&#xf…

java udp簡單聊天程序_Java基于UDP協議實現簡單的聊天室程序

最近比較閑,一直在抽空回顧一些java方面的技術應用。今天沒什么事做,基于udp協議,寫了一個非常簡單的聊天室程序。現在的工作,很少用到socket,也算是對java網絡編程方面的一個簡單回憶。先看一下效果:實現的…

java9 反應編程_Java9第四篇-Reactive Stream API響應式編程

file我計劃在后續的一段時間內,寫一系列關于java 9的文章,雖然java 9 不像Java 8或者Java 11那樣的核心java版本,但是還是有很多的特性值得關注。期待您能關注我,我將把java 9 寫成一系列的文章,大概十篇左右。Java 9的…

bb10系統支持java嗎_黑莓BB10怎么樣 BlackBerry 10系統好用嗎?

曾幾何時黑莓Blackberry OS是一款十分受用戶歡迎的手機系統,不過隨著手機系統市場已經被蘋果iOS、谷歌安卓、微軟Windows Phone三分天下,致使曾經的黑莓帝國逐漸淪陷,體驗和性能都已經明顯跟不上iOS與安卓等系統的腳步了,也因為如…

java中興參與實參相同_中興通訊_傳輸SDH試題(含答案)

中興傳輸SDH試題一、單項選擇題(每小題2分,共30分)1、在SDH系統中, RSOH指(A)。A.再生段開銷B.復用段開銷C.再生段通道開銷D.復用段通道開銷2.、同步數字體系SDH具有(A)幀結構。A.塊狀B.串行C.鏈形D.三維3、管理指針單元的作用是(A)。A、用來指示信息凈負荷的第一個…

php 正則提取url,php 正則表達式提取網頁超級鏈接url的函數

function match_links($document) {preg_match_all("]))[^>]*>?(.*?)isx",$document,$links);while(list($key,$val) each($links[2])) {if(!empty($val))$match[link][] $val;}while(list($key,$val) each($links[3])) {if(!empty($val))$match[link][] …

php array colum,php5.5新數組函數array_column使用

array_column 用于獲取二維數組中的元素(PHP 5 > 5.5.0),但我們有時候需要在低版本中使用,那么就可以使用下面的代碼即可PHP5.5發布了,其中增加了一個新的數組函數array_column,感覺不錯的!但是低版本PHP要使用&…

php 將字符串打亂,PHP內部實現打亂字符串順序函數str_shuffle的方法

前言2019年春節已過,今天是上班第一天,還得翻一翻之前沒有看完的PHP源碼。今天聊的是字符串順序打亂函數str_shuffle。這個函數本身使用頻率并不高。但是,其內部實現還是非常有趣的。str_shuffle() 函數隨機地打亂字符串中的所有字符。要注意…

php+js+return+true,js中return、return false、return true的區別

1.語法及返回方式①返回控制與函數結果語法為:return 表達式;語句結果函數的執行,返回調用函數,而且把表達式的值作為函數結果返回出去②返回控制無函數結果語法為:return;在大多數情況下,為事件處理函數如果讓其返回false,可以防止默認的事件行為.例如,默認情況下,點擊一個標簽…

php strlen遇0截斷,聊下php下的截斷問題

0x01 起因有天在群里說起上傳的%00截斷的一些問題,就想起之前自己在這個問題踩過坑,想起了自己曾經的flag說要寫文章,一直沒寫,現在來填坑了。0x02 經過源碼理解1234//test.phpinclude "1.txt\000.jpg";?>1234//1.t…

test.php.bak,記一次phpmyadmin 4.8.1 遠程文件包含漏洞(BUUCTF web)

題目很簡單,一個滑稽打開源碼,發現存在source.php文件于是訪問文件,發現出現一串php源碼提示存在hint.php,于是訪問發現一句話flag not here, and flag in ffffllllaaaagggg再回過頭來觀察source.php明顯是一道代碼審計的問題&…

php中files和FILRS,php獲取文件內容最后一行示例

php獲取文件內容最后一行示例復制代碼 代碼如下:$rs README.md;$fp fopen($rs, r);fseek($fp,-1,SEEK_END);$s ;while(($c fgetc($fp)) ! false){if($c "\n" && $s) break;$s $c . $s;fseek($fp, -2, SEEK_CUR);}fclose($fp);echo $s;exit;時間&#x…

php 實現貪吃蛇游戲,C++實現簡單貪吃蛇游戲

我大概在一個多月前把自己上學期寫的c代碼的貪吃蛇游戲push到csdn上,并且說c風格的貪吃蛇寫起來有些麻煩(貪吃蛇游戲的c語言實現),準備用面向對象的c再寫一遍。現在我們專業恰好剛教完了c,學校也布置了一道簡單的貪吃蛇的編程題目&#xff0c…

java中的斜杠和反斜杠,老生常談java路徑中的反斜杠和斜杠的區別

JAVA中的斜杠有正斜杠與反斜杠之分,正斜杠,一般就叫做斜杠,符號為“/”;反斜杠的符號為“\”。斜杠(/)在JAVA中沒有什么特別的意義,就是代表一個字符‘/;反斜杠(\)則不然,它和緊跟著它的那個字符構成轉義字…

小程序 php cookie,微信小程序使用Cookie

微信小程序使用Cookie微信小程序不支持Cookie,因此,需要借助小程序的數據緩存來實現Cookie.環境: mpvue fly.js登錄成功后,在處理登錄驗證的method里,加入以下內容保存Cookie:wx.setStorageSync("sessionid",response.headers["set-cookie"][0])我對fly.j…

php對象好用嗎,在數據庫中使用對象的好處_php

我們都知道如何從mysql獲取我們需要的行(記錄),讀取數據,然后存取一些改動。很明顯也很直接,在這個過程背后也沒有什么拐彎抹角的。然而對于我們使用面對對象的程序設計(OOP)來管理我們數據庫中的數據時,這個過程就需要大大改進一…