騰訊-測試開發(fā)面經(jīng)(三)
點擊藍字關注我們,獲取更多面經(jīng)

多態(tài)
所謂的“多態(tài)”,簡單的理解就是對象在不同情況下的不同表現(xiàn),具體體現(xiàn)在定義和功能兩個方面,簡單的總結(jié)一下,多態(tài)可以用“三個定義和兩個方法”來總結(jié)。三個定義分別是父類定義子類構(gòu)建、接口定義實現(xiàn)類構(gòu)建和抽象類定義實體類構(gòu)建,而兩個方法分別是方法重載和方法重寫。
方法重載的概念比較好理解,簡單的說,就是在同一個類中,定義了多個方法,具有相同的方法名稱和不同的參數(shù)列表。方法重載只看名稱和參數(shù)列表,其他的都不看,包括返回值類型、屬性修飾符、范圍限定等,這些都不影響方法重載的概念。
方法重寫可以用“一個前提、三個相同和兩個規(guī)定”來總結(jié),前提是在繼承體系結(jié)構(gòu)下,三個相同代表子類中定義的方法與父類中的方法,具有相同的名字、參數(shù)列表和返回值類型,兩個規(guī)定分別是子類方法的范圍限定不能比父類方法的范圍小,以及不能拋出更多的異常。當然,final類型的方法和static類型的方法是不能被重寫的。
父類定義子類構(gòu)建還是比較好理解的,但是如果采用了這種定義方式,也就意味著對象本身并不能調(diào)用子類獨有的方法,而如果調(diào)用的方法恰好覆蓋了父類中的方法,則還涉及到“虛方法”的概念,實際上執(zhí)行的是子類方法體中的功能語句。
接口定義實體類構(gòu)建是Java中非常常見的一種多態(tài)形勢,而且由于接口屬于全抽象方式,所以這種方式可以在很大程度上提升程序的“健壯性”,也是比較推薦的編程方式。采用接口定義類構(gòu)建的方式,可以在很大程度上提升代碼的可復用性。
抽象類定義實體類構(gòu)建是接口定義方式的一種擴展,通??梢杂迷诖a的模塊內(nèi)部,從而提升代碼的內(nèi)聚性。
指針和引用的區(qū)別
(1)指針:指針是一個變量,只不過這個變量存儲的是一個地址,指向內(nèi)存的一個存儲單元;而引用跟原來的變量實質(zhì)上是同一個東西,只不過是原變量的一個別名而已。如:
int a=1;int *p=&a;
int a=1;int &b=a;
上面定義了一個整形變量和一個指針變量p,該指針變量指向a的存儲單元,即p的值是a存儲單元的地址。
而下面2句定義了一個整形變量a和這個整形a的引用b,事實上a和b是同一個東西,在內(nèi)存占有同一個存儲單元。
(2)引用不可以為空,當被創(chuàng)建的時候,必須初始化,而指針可以是空值,可以在任何時候被初始化。
(3)可以有const指針,但是沒有const引用;
(4)指針可以有多級,但是引用只能是一級(int **p;合法 而 int &&a是不合法的)
(5)指針的值可以為空,但是引用的值不能為NULL,并且引用在定義的時候必須初始化;
(6)指針的值在初始化后可以改變,即指向其它的存儲單元,而引用在進行初始化后就不會再改變了。
(7)”sizeof引用”得到的是所指向的變量(對象)的大小,而”sizeof指針”得到的是指針本身的大?。?/span>
(8)指針和引用的自增(++)運算意義不一樣;
(9)如果返回動態(tài)內(nèi)存分配的對象或者內(nèi)存,必須使用指針,引用可能引起內(nèi)存泄漏;
http和https的區(qū)別
1、https協(xié)議需要到ca申請證書,一般免費證書較少,因而需要一定費用。
2、http是超文本傳輸協(xié)議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協(xié)議。
3、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
4、http的連接很簡單,是無狀態(tài)的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進行加密傳輸、身份認證的網(wǎng)絡協(xié)議,比http協(xié)議安全。
ssl加密
SSL協(xié)議提供的安全通道有以下三個特性:
機密性:SSL協(xié)議使用密鑰加密通信數(shù)據(jù)。
可靠性:服務器和客戶都會被認證,客戶的認證是可選的。
完整性:SSL協(xié)議會對傳送的數(shù)據(jù)進行完整性檢查。
SSL的握手與密鑰協(xié)商過程
基于RSA握手和密鑰交換的客戶端驗證服務器為示例詳解TLS/SSL握手過程。
TLS/SSL握手過程
(1).client_hello
客戶端發(fā)起請求,以明文傳輸請求信息,包含:版本信息,加密套件候選列表,壓縮算法候選列表,隨機數(shù),擴展字段等信息。
ClientHello 客戶發(fā)送CilentHello信息,包含如下內(nèi)容:
(1)客戶端可以支持的SSL最高版本號
(2)一個用于生成主秘密的32字節(jié)的隨機數(shù)(random_C)。(用于生成主密鑰)
(3)一個確定會話的會話ID。
(4)一個客戶端可以支持的密碼套件列表。
(5)一個客戶端可以支持的壓縮算法列表。
(2).server_hello+server_certificate+sever_hello_done
l server_hello
服務端返回協(xié)商的信息結(jié)果,包括選擇使用的協(xié)議版本 version,選擇的加密套件,選擇的壓縮算法、隨機數(shù) random_S 等,其中隨機數(shù)用于后續(xù)的密鑰協(xié)商(用于產(chǎn)生主密鑰);
l server_certificates
服務器端配置對應的證書鏈(公鑰放在證書中),用于身份驗證與密鑰交換;
l server_hello_done
通知客戶端 server_hello 信息發(fā)送結(jié)束;
(3).證書校驗
客戶端驗證證書的合法性,如果驗證通過才會進行后續(xù)通信,否則根據(jù)錯誤情況不同做出提示和操作,合法性驗證包括如下:
證書鏈的可信性、證書是否吊銷、有效期 、域名
(4).client_key_exchange+change_cipher_spec+encrypted_handshake_message
l client_key_exchange
合法性驗證通過之后,客戶端計算產(chǎn)生隨機數(shù)字 Pre-master,并用證書公鑰加密,發(fā)送給服務器;
l 此時客戶端已經(jīng)獲取全部的計算協(xié)商密鑰需要的信息:兩個明文隨機數(shù) random_C 和 random_S 與自己計算產(chǎn)生的 Pre-master,計算得到協(xié)商密鑰;enc_key=Fuc(random_C, random_S, Pre-Master)
l change_cipher_spec
客戶端通知服務器后續(xù)的通信都采用協(xié)商的通信密鑰和加密算法進行加密通信;
l encrypted_handshake_message
結(jié)合之前所有通信參數(shù)的 hash 值與其它相關信息生成一段數(shù)據(jù),采用協(xié)商密鑰 session secret 與算法進行加密,然后發(fā)送給服務器用于數(shù)據(jù)與握手驗證;
(5).change_cipher_spec+encrypted_handshake_message
l 服務器用私鑰解密加密的 Pre-master 數(shù)據(jù),基于之前交換的兩個明文隨機數(shù) random_C 和 random_S,計算得到協(xié)商密鑰:enc_key=Fuc(random_C, random_S, Pre-Master);
l 計算之前所有接收信息的 hash 值,然后解密客戶端發(fā)送的 encrypted_handshake_message,驗證數(shù)據(jù)和密鑰正確性;
l change_cipher_spec
驗證通過之后,服務器同樣發(fā)送 change_cipher_spec 以告知客戶端后續(xù)的通信都采用協(xié)商的密鑰與算法進行加密通信;
l encrypted_handshake_message
服務器也結(jié)合所有當前的通信參數(shù)信息生成一段數(shù)據(jù)并采用協(xié)商密鑰 session secret 與算法加密并發(fā)送到客戶端;
(6).握手結(jié)束
客戶端計算所有接收信息的 hash 值,并采用協(xié)商密鑰解密 encrypted_handshake_message,驗證服務器發(fā)送的數(shù)據(jù)和密鑰,驗證通過則握手完成;
(7).加密通信
開始使用協(xié)商密鑰與算法進行加密通信。
數(shù)字證書
數(shù)字證書是一個經(jīng)證書授權(quán)中心數(shù)字簽名的包含公開密鑰擁有者信息以及公開密鑰的文件。最簡單的證書包含一個公開密鑰、名稱以及證書授權(quán)中心的數(shù)字簽名。數(shù)字證書還有一個重要的特征就是只在特定的時間段內(nèi)有效。
更多面經(jīng)
掃描二維碼
獲取更多面經(jīng)
扶搖就業(yè)
