???? 學(xué)習(xí)交流群:
??1:這是孫哥suns給大家的福利!
??2:我們免費(fèi)分享Netty、Dubbo、k8s、Mybatis、Spring...應(yīng)用和源碼級(jí)別的視頻資料
????3:QQ群:583783824 ? ???? ?工作微信:BigTreeJava 拉你進(jìn)微信群,免費(fèi)領(lǐng)??!
????4:本文章內(nèi)容出自上述:Spring應(yīng)用課程!????
????5:以上內(nèi)容,進(jìn)群免費(fèi)領(lǐng)取呦~ ????????
文章目錄
一:方法的調(diào)用
1:概述
2:靜態(tài)鏈接
3:動(dòng)態(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中,將符號(hào)引用轉(zhuǎn)換為調(diào)用方法的直接引用這個(gè)操作是跟JVM當(dāng)中方法的綁定機(jī)制息息相關(guān)的。
? ? ? ? 說人話:
? ? ? ? 上邊這段話是什么意思?我這里給大家解釋一下,我們javap整理完畢字節(jié)碼文件之后,我們會(huì)可以在任意一個(gè)方法中查看code下的字節(jié)碼指令,很多字節(jié)碼指令的后邊都會(huì)跟#數(shù)字這么一個(gè)概念,這個(gè)就是符號(hào)引用,這個(gè)引用指向常量池。
? ? ? ? 所謂將符號(hào)引用轉(zhuǎn)換為方法的直接引用,就是將這個(gè)字節(jié)碼指令后邊的符號(hào)引用,轉(zhuǎn)變?yōu)檎鎸?shí)的方法。
? ? ? ? 下列中的#3就是符號(hào)引用。
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
? ? ? ? 從上述找一個(gè)例子的話,就是將偏移地址為9的字節(jié)碼指令后邊的#7這個(gè)符號(hào)引用用真實(shí)的方法字面量代替
2:靜態(tài)鏈接
? ? ? ? 官方說法:
????????當(dāng)一個(gè)字節(jié)碼文件被裝載進(jìn)JVM內(nèi)部時(shí),如果被調(diào)用的目標(biāo)方法在編譯期可知且運(yùn)行期保持不變時(shí)。這種情況下將調(diào)用方法的符號(hào)引用轉(zhuǎn)換為直接引用的過程稱之為靜態(tài)鏈接。
? ? ? ? 說人話:
? ? ? ? 靜態(tài)鏈接:這種方式在編譯階段就已經(jīng)把符號(hào)引用直接轉(zhuǎn)換為了直接引用。
3:動(dòng)態(tài)鏈接
? ? ? ? 官方說法:
????????如果被調(diào)用的方法在編譯期無法被確定下來,也就是說,只能夠在程序運(yùn)行期將調(diào)用方法的符號(hào)引用轉(zhuǎn)換為直接引用,由于這種引用轉(zhuǎn)換過程具備動(dòng)態(tài)性,因此也就被稱之為動(dòng)態(tài)鏈接。
? ? ? ? 說人話:
? ? ? ? 動(dòng)態(tài)鏈接:這種方式在運(yùn)行階段才能把符號(hào)引用直接轉(zhuǎn)換為直接引用。
二:方法的綁定
1:綁定概念
????????綁定是一個(gè)字段、方法或者類在符號(hào)引用被替換為直接引用的過程,這僅僅發(fā)生一次。這個(gè)不論是編譯器確定還是運(yùn)行期確定都只會(huì)發(fā)生一次,不會(huì)修改。
????????對(duì)應(yīng)的方法的綁定機(jī)制為:早期綁定 (Early Bindng)和晚期綁定(Late Binding)。
2:早期綁定
? ? ? ? 官方說法:
????????早期綁定就是指被調(diào)用的目標(biāo)方法如果在編譯期可知,且運(yùn)行期保持不變時(shí)即可將這個(gè)方法與所屬的類型進(jìn)行綁定,這樣一來,由于明確了被調(diào)用的目標(biāo)方法究竟是哪一個(gè),因此也就可以使用靜態(tài)鏈接的方式將符號(hào)引用轉(zhuǎn)換為直接引用。
? ? ? ? 說人話:
? ? ? ? 早期綁定是和我們的靜態(tài)綁定相對(duì)應(yīng)的。
3:晚期綁定
? ? ? ? 官方說法:
????????如果被調(diào)用的方法在編譯期無法被確定下來,只能夠在程序運(yùn)行期根據(jù)實(shí)際的類型綁定相關(guān)的方法,這種綁定方式也就被稱之為晚期綁定
? ? ? ? 說人話:
? ? ? ? 晚期綁定是和我們的動(dòng)態(tài)綁定相對(duì)應(yīng)的。
三:晚期綁定示例
1:編寫代碼
class Animal {
public void eat(){
System.out.println("動(dòng)物進(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("動(dòng)物進(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這個(gè)類上查看他的jclasslib
?????????invokeSpecial是早期綁定字節(jié)碼指令,invokevirtual是晚期綁定的字節(jié)碼指令。
五:總結(jié)說明
????????隨著高級(jí)語(yǔ)言的橫空出世,類似于Java一樣的基于面向?qū)ο蟮木幊陶Z(yǔ)言如今越來越多,盡管這類編程語(yǔ)言在語(yǔ)法風(fēng)格上存在一定的差別,但是它們彼此之間始終保持著一個(gè)共性,那就是都支持封裝、繼承和多態(tài)等面向?qū)ο筇匦?/p>
????????既然這一類的編程語(yǔ)言具備多態(tài)特性,那么自然也就具備早期綁定和晚期綁定兩種綁定方式。
????????Java中任何一個(gè)普通的方法其實(shí)都具備虛函數(shù)的特征,也就是運(yùn)行期才能確定下來,它們相當(dāng)于c++語(yǔ)言中的虛函數(shù) (c++中則需要使用關(guān)鍵字virtual來顯式定義)。
????????如果在Java程序中不希望某個(gè)方法擁有虛函數(shù)的特征時(shí),則可以使用關(guān)鍵字final來標(biāo)記這個(gè)方法。也就是一個(gè)方法不想被晚期綁定,直接把他給final修飾即可。
?
文章目錄
一:通信中地址簡(jiǎn)介? ? ? ??
1:地址的唯一性
(一):唯一性狹義概念
(二):唯一性廣義概念????????
2:地址的層次性
(一):地址分層的意義
(二):MAC地址優(yōu)劣
(三):IP地址的便利
一:通信中地址簡(jiǎn)介? ? ? ??
????????通信傳輸中,發(fā)送端和接收端可以被視為通信主體。它們都能由一個(gè)所謂“地址”的信息加以標(biāo)識(shí)出來。當(dāng)人們使用電話時(shí),電話號(hào)碼就相當(dāng)于“地址”。當(dāng)人們選擇寫信時(shí),通信地址加上姓名就相當(dāng)于“地址”。
????????在計(jì)算機(jī)通信當(dāng)中,這種地址的概念顯得要復(fù)雜一些。因?yàn)樵趯?shí)際的網(wǎng)絡(luò)通信當(dāng)中,每一層的協(xié)議所使用的地址都不盡相同。TCP/IP 通信中使用 MAC 地址、IP 地址等信息作為地。甚至在應(yīng)用層中,可以將電子郵件地址作為網(wǎng)絡(luò)通信的地址。
1:地址的唯一性
(一):唯一性狹義概念
????????一個(gè)地址必須明確地表示一個(gè)主體對(duì)象。在同一個(gè)通信網(wǎng)絡(luò)中不允許有兩個(gè)相同地址的通信主體存在。這也就是地址的唯一性。
(二):唯一性廣義概念????????
????????到此為止,讀者可能會(huì)有一個(gè)疑問。前面提到,在同一個(gè)通信網(wǎng)絡(luò)中不允許有兩個(gè)相同地址的通信主體存在。這在單播通信中還好理解,因?yàn)橥ㄐ艃啥硕际菃我坏闹鳈C(jī)。那么對(duì)于廣播、多播、任播通信該如何理解呢?豈不是通信接收端都被賦予了同一個(gè)地址?其實(shí),在某種程度上,這樣理解有一定的合理性。在上述這些通信方式中,接收端設(shè)備可能不止一個(gè)。為此,可以對(duì)這些由多個(gè)設(shè)備組成的一組通信賦予同一個(gè)具有唯一特性的地址,從而可以避免產(chǎn)生歧義,明確接收對(duì)象。
??????????舉個(gè)簡(jiǎn)單的多播的例子。某位老師說:“一年一班的同學(xué)們請(qǐng)起立!”其中“一年一班”實(shí)際上就明確地指代了目對(duì)象。此時(shí),“一年一班”就是這一次“多”的目標(biāo)地址,具有唯一性。
????????再舉一個(gè)任播的例子。老師又說:“一年一班的哪位同學(xué)過來把你們班的學(xué)習(xí)資取走!”“一哪同”(任意一位同學(xué))就成為了此次“任”的目地址有一性。
2:地址的層次性
(一):地址分層的意義
????????當(dāng)?shù)刂房倲?shù)并不是很多的情況下,有了唯一地址就可以定位相互通信的主體。然而,當(dāng)?shù)刂返目倲?shù)越來越多時(shí),如何高效地從中找出通信的目標(biāo)地址將成為一個(gè)重要的問題。為此人們發(fā)現(xiàn)地址除了具有唯一性還需要具有層次性。其實(shí),在使用電話和信件通信的過程當(dāng)中,早已有了地址分層這種概念。例如,電話號(hào)碼包含國(guó)家區(qū)號(hào)和國(guó)內(nèi)區(qū)號(hào),通信地址包含國(guó)名、省名、市名和區(qū)名等。正是有了這種層次分類才能更加快速地定位某一個(gè)地址。
????????MAC 地址和 IP 地址在識(shí)一個(gè)通信主體時(shí)雖然都具有唯一性,但是它們當(dāng)中只有 IP 地址具有層次性。?
(二):MAC地址優(yōu)劣
????????MAC 地址由設(shè)備的制造廠商針對(duì)每塊網(wǎng)卡進(jìn)行分別指定。人們可以通過制造商識(shí)別號(hào)、制造商內(nèi)部產(chǎn)品編號(hào)以及產(chǎn)品通用編號(hào)確保 MAC 址的唯一性。然而,人們無法確定哪家廠商的哪個(gè)網(wǎng)卡被用到了哪個(gè)地方。雖然 MAC 地址中的制造商識(shí)別號(hào)、產(chǎn)品編號(hào)以及通用編號(hào)等信息在某種度上也具有一定的層次性但是對(duì)于尋找地址并沒有起到任何作用,所以不能算作有層次的地址。正因如此雖然 MAC 地址是真正負(fù)責(zé)最終通信的地址,但是在實(shí)際尋址過中,IP 地址卻必不可少。
(三):IP地址的便利
????????那么IP 地址又是怎樣實(shí)現(xiàn)分層的呢?一方面,IP地址由網(wǎng)絡(luò)號(hào)和機(jī)號(hào)兩部分組成。即使通信主體的IP 地址不同,若主機(jī)號(hào)不同,網(wǎng)絡(luò)號(hào)相同,說明它們處于同一個(gè)網(wǎng)段。通常,同處一個(gè)網(wǎng)段的主機(jī)也都屬于同一個(gè)部門或集團(tuán)組織。另方面,網(wǎng)絡(luò)號(hào)相同的主機(jī)在組織結(jié)構(gòu)、提供商類型和地域分上都比較集中也為 IP 尋址帶來了極大的方便。這也是為什么說 IP 地址具有層次性的原因。
????????網(wǎng)絡(luò)傳輸中,每個(gè)節(jié)點(diǎn)會(huì)根據(jù)分組數(shù)據(jù)的地址信息,來判斷該報(bào)文應(yīng)該由哪個(gè)網(wǎng)卡發(fā)送出去。為此,各個(gè)地址會(huì)參考一個(gè)發(fā)出接口列表。在這一點(diǎn)上 MAC 尋址與IP 尋址是一樣的。只不過 MAC 尋址中所參考的這張表叫做地址轉(zhuǎn)發(fā)表,而IP尋址中所參考的叫做路由控制表。MAC 地址轉(zhuǎn)發(fā)表中所記錄的是實(shí)際的 MAC地址本身,而路由表中記錄的 IP 地址則是集了之后的網(wǎng)絡(luò)號(hào)
文章來源:http://www.zghlxwxcb.cn/news/detail-730901.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-730901.html
到了這里,關(guān)于詳解TCP/IP協(xié)議第五篇:詳細(xì)介紹網(wǎng)絡(luò)傳輸中的地址的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!