???? 學(xué)習(xí)交流群:
??1:這是孫哥suns給大家的福利!
??2:我們免費分享Netty、Dubbo、k8s、Mybatis、Spring...應(yīng)用和源碼級別的視頻資料
????3:QQ群:583783824 ? ???? ?工作微信:BigTreeJava 拉你進(jìn)微信群,免費領(lǐng)取!
????4:本文章內(nèi)容出自上述:Spring應(yīng)用課程!????
????5:以上內(nèi)容,進(jìn)群免費領(lǐng)取呦~ ????????
文章目錄
一:方法的調(diào)用
1:概述
2:靜態(tài)鏈接
3:動態(tài)鏈接
二:方法的綁定
1:綁定概念
2:早期綁定
3:晚期綁定
三:晚期綁定示例
1:編寫代碼
2:jclasslib查看內(nèi)容
四:早期綁定示例?
1:編寫代碼
2:jclasslib查看內(nèi)容
五:總結(jié)說明
一:方法的調(diào)用
? ? ? ? 我們每天都在寫方法的調(diào)用,但是我們能搞明白其中的原理和JVM當(dāng)中的操作步驟么?這就是本文的意義。
1:概述
? ? ? ? 官方說法:
? ? ? ? 在JVM中,將符號引用轉(zhuǎn)換為調(diào)用方法的直接引用這個操作是跟JVM當(dāng)中方法的綁定機制息息相關(guān)的。
? ? ? ? 說人話:
? ? ? ? 上邊這段話是什么意思?我這里給大家解釋一下,我們javap整理完畢字節(jié)碼文件之后,我們會可以在任意一個方法中查看code下的字節(jié)碼指令,很多字節(jié)碼指令的后邊都會跟#數(shù)字這么一個概念,這個就是符號引用,這個引用指向常量池。
? ? ? ? 所謂將符號引用轉(zhuǎn)換為方法的直接引用,就是將這個字節(jié)碼指令后邊的符號引用,轉(zhuǎn)變?yōu)檎鎸嵉姆椒ā?/p>
? ? ? ? 下列中的#3就是符號引用。
public void methodB();
descriptor: ()V
flags: (0x0001) ACC_PUBLIC
Code:
stack=3, locals=1, args_size=1
0: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #6 // String methodB().....
5: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: aload_0
9: invokevirtual #7 // Method methodA:()V
12: aload_0
13: dup
14: getfield #2 // Field num:I
17: iconst_1
18: iadd
19: putfield #2 // Field num:I
22: return
? ? ? ? 從上述找一個例子的話,就是將偏移地址為9的字節(jié)碼指令后邊的#7這個符號引用用真實的方法字面量代替
2:靜態(tài)鏈接
? ? ? ? 官方說法:
????????當(dāng)一個字節(jié)碼文件被裝載進(jìn)JVM內(nèi)部時,如果被調(diào)用的目標(biāo)方法在編譯期可知且運行期保持不變時。這種情況下將調(diào)用方法的符號引用轉(zhuǎn)換為直接引用的過程稱之為靜態(tài)鏈接。
? ? ? ? 說人話:
? ? ? ? 靜態(tài)鏈接:這種方式在編譯階段就已經(jīng)把符號引用直接轉(zhuǎn)換為了直接引用。
3:動態(tài)鏈接
? ? ? ? 官方說法:
????????如果被調(diào)用的方法在編譯期無法被確定下來,也就是說,只能夠在程序運行期將調(diào)用方法的符號引用轉(zhuǎn)換為直接引用,由于這種引用轉(zhuǎn)換過程具備動態(tài)性,因此也就被稱之為動態(tài)鏈接。
? ? ? ? 說人話:
? ? ? ? 動態(tài)鏈接:這種方式在運行階段才能把符號引用直接轉(zhuǎn)換為直接引用。
二:方法的綁定
1:綁定概念
????????綁定是一個字段、方法或者類在符號引用被替換為直接引用的過程,這僅僅發(fā)生一次。這個不論是編譯器確定還是運行期確定都只會發(fā)生一次,不會修改。
????????對應(yīng)的方法的綁定機制為:早期綁定 (Early Bindng)和晚期綁定(Late Binding)。
2:早期綁定
? ? ? ? 官方說法:
????????早期綁定就是指被調(diào)用的目標(biāo)方法如果在編譯期可知,且運行期保持不變時即可將這個方法與所屬的類型進(jìn)行綁定,這樣一來,由于明確了被調(diào)用的目標(biāo)方法究竟是哪一個,因此也就可以使用靜態(tài)鏈接的方式將符號引用轉(zhuǎn)換為直接引用。
? ? ? ? 說人話:
? ? ? ? 早期綁定是和我們的靜態(tài)綁定相對應(yīng)的。
3:晚期綁定
? ? ? ? 官方說法:
????????如果被調(diào)用的方法在編譯期無法被確定下來,只能夠在程序運行期根據(jù)實際的類型綁定相關(guān)的方法,這種綁定方式也就被稱之為晚期綁定
? ? ? ? 說人話:
? ? ? ? 晚期綁定是和我們的動態(tài)綁定相對應(yīng)的。
三:晚期綁定示例
1:編寫代碼
class Animal {
public void eat(){
System.out.println("動物進(jìn)食");
}
}
interface Huntable{
void hunt();
}
class Dog extends Animal implements Huntable{
@Override
public void eat(){
System.out.println("狗吃骨頭");
}
@Override
public void hunt() {
System.out.println("捕食耗子,多管閑事");
}
}
class Cat extends Animal implements Huntable{
@Override
public void eat(){
System.out.println("貓吃魚");
}
@Override
public void hunt() {
System.out.println("捕食耗子,天經(jīng)地義");
}
}
public class AnimalTest{
public void showAnimal(Animal animal){
animal.eat();//晚期綁定
}
public void showHunt(Huntable h){
h.hunt();//晚期綁定
}
}
2:jclasslib查看內(nèi)容
四:早期綁定示例?
1:編寫代碼
class Animal {
public void eat(){
System.out.println("動物進(jìn)食");
}
}
interface Huntable{
void hunt();
}
class Dog extends Animal implements Huntable{
@Override
public void eat(){
super.eat();//早期綁定
System.out.println("狗吃骨頭");
}
@Override
public void hunt() {
System.out.println("捕食耗子,多管閑事");
}
}
class Cat extends Animal implements Huntable{
public Cat(){
super();//早期綁定
}
public Cat(String name){
this();//早期綁定
}
@Override
public void eat(){
System.out.println("貓吃魚");
}
@Override
public void hunt() {
System.out.println("捕食耗子,天經(jīng)地義");
}
}
public class AnimalTest{
public void showAnimal(Animal animal){
animal.eat();//晚期綁定
}
public void showHunt(Huntable h){
h.hunt();//晚期綁定
}
}
2:jclasslib查看內(nèi)容
? ? ? ? 光標(biāo)放到cat這個類上查看他的jclasslib
?????????invokeSpecial是早期綁定字節(jié)碼指令,invokevirtual是晚期綁定的字節(jié)碼指令。
五:總結(jié)說明
????????隨著高級語言的橫空出世,類似于Java一樣的基于面向?qū)ο蟮木幊陶Z言如今越來越多,盡管這類編程語言在語法風(fēng)格上存在一定的差別,但是它們彼此之間始終保持著一個共性,那就是都支持封裝、繼承和多態(tài)等面向?qū)ο筇匦?/p>
????????既然這一類的編程語言具備多態(tài)特性,那么自然也就具備早期綁定和晚期綁定兩種綁定方式。
????????Java中任何一個普通的方法其實都具備虛函數(shù)的特征,也就是運行期才能確定下來,它們相當(dāng)于c++語言中的虛函數(shù) (c++中則需要使用關(guān)鍵字virtual來顯式定義)。
????????如果在Java程序中不希望某個方法擁有虛函數(shù)的特征時,則可以使用關(guān)鍵字final來標(biāo)記這個方法。也就是一個方法不想被晚期綁定,直接把他給final修飾即可。
文章目錄
一:前言
1:手握金剛鉆的TCP/IP
2:計算機中的協(xié)議
3:分組交換協(xié)議
4:協(xié)議的標(biāo)準(zhǔn)化
一:前言
1:手握金剛鉆的TCP/IP
TCP/IP是通信協(xié)議的總稱。在接下來我們研究TCP/IP的核心機制之前,我們有必要先理清楚協(xié)議的概念。
在計算機網(wǎng)絡(luò)與信息通信領(lǐng)域里,人們經(jīng)常提及“協(xié)議”一詞?;ヂ?lián)網(wǎng)中常用的具有代表性的協(xié)議有 IP、TCP、HTTP 等。而LAN (局域網(wǎng))中常用的協(xié)議有IPX/SPX等。
“計算機網(wǎng)絡(luò)體系結(jié)構(gòu)”將這些網(wǎng)絡(luò)協(xié)議進(jìn)行了系統(tǒng)的歸納。TCP/IP 就是IP、TCP、HTTP 等協(xié)議的集合?,F(xiàn)在,很多設(shè)備都支持 TCP/IP。除此之外,還有很多其他類型的網(wǎng)絡(luò)體系結(jié)構(gòu)。例如,Novell 公司的IPX/SPX、蘋果公司的AppleTalk (僅限蘋果公司計算機使用)、IBM公司開發(fā)的用于構(gòu)建大規(guī)模網(wǎng)絡(luò)的SNAY以及前 DEC公司開發(fā)的 DECnet 等。
2:計算機中的協(xié)議
在計算機通信中,事先達(dá)成一個詳細(xì)的約定,并遵循這一約定進(jìn)行處理尤為重要。這種約定其實就是“協(xié)議”。
3:分組交換協(xié)議
分組交換是指將大數(shù)據(jù)分割為一個個叫做包 (Packet) 的較小單位進(jìn)傳輸?shù)姆椒?。這里所說的包,如同我們平常在郵局里見到的郵包。分組交換就是將大數(shù)據(jù)分裝為一個個這樣的郵包交給對方。
計算機通信也會在每一個分組中附加上源主機地址和目標(biāo)主機地址送給通信線路。這些發(fā)送端地址、接收端地址以及分組序號寫人的部分稱為“報文首部”。
一個較大的數(shù)據(jù)被分為多個分組時,為了標(biāo)明是原始數(shù)據(jù)中的哪一部分,就有必要將分組的序號寫入包中。接收端會根據(jù)這個序號,再將每個分組按照序號重新裝配為原始數(shù)據(jù)。
通信協(xié)議中,通常會規(guī)定報文首部應(yīng)該寫入哪些信息、應(yīng)該如何處理這些信息。相互通信的每一臺計算機則根據(jù)協(xié)議構(gòu)造報文首部、讀取首部內(nèi)容等。為了雙方能正確通信,分組的發(fā)送方和接收方有必要對報文首部和內(nèi)容保持一致的定義和解釋。
4:協(xié)議的標(biāo)準(zhǔn)化
隨著計算機重要性的不斷提高,很多公司逐漸意識到兼容性的重要意義。人們開始著手研究使不同廠商生產(chǎn)的異構(gòu)機型也能夠互相通信的技術(shù)。這促進(jìn)了網(wǎng)絡(luò)的開放性和多供性。
為了解決上述問題,ISO制定了一個國際標(biāo)準(zhǔn)OSI,對通信系統(tǒng)進(jìn)行了標(biāo)準(zhǔn)化。現(xiàn)在,OSI所定義的協(xié)議雖然并沒有得到普及,但是在 OSI 協(xié)議設(shè)計之初作為其指導(dǎo)方針的 OSI參考模型卻常被用于網(wǎng)絡(luò)協(xié)議的制定當(dāng)中。本書將要說明的TCP/IP 并非 ISO所制定的某種國際標(biāo)準(zhǔn)。而是由IETF所建議的、致力于推進(jìn)其標(biāo)準(zhǔn)化作業(yè)的一種協(xié)議。在當(dāng)時,大學(xué)等研究機構(gòu)和計算機行業(yè)作為中心力量,推動了 TCP/IP 的標(biāo)準(zhǔn)化進(jìn)。TCP/IP 作為互聯(lián)網(wǎng)之上的一種標(biāo)準(zhǔn),也作為業(yè)界標(biāo)準(zhǔn),儼然已成為全世界所廣泛應(yīng)用的通信協(xié)議。文章來源:http://www.zghlxwxcb.cn/news/detail-703273.html
參考書籍:圖解TCP/IP協(xié)議文章來源地址http://www.zghlxwxcb.cn/news/detail-703273.html
到了這里,關(guān)于計算機網(wǎng)絡(luò)之TCP/IP協(xié)議第一篇:網(wǎng)絡(luò)基礎(chǔ)知識的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!