腾讯-测试开发面经(三)
共 3510字,需浏览 8分钟
·
2021-03-26 21:54
点击蓝字关注我们,获取更多面经
多态
所谓的“多态”,简单的理解就是对象在不同情况下的不同表现,具体体现在定义和功能两个方面,简单的总结一下,多态可以用“三个定义和两个方法”来总结。三个定义分别是父类定义子类构建、接口定义实现类构建和抽象类定义实体类构建,而两个方法分别是方法重载和方法重写。
方法重载的概念比较好理解,简单的说,就是在同一个类中,定义了多个方法,具有相同的方法名称和不同的参数列表。方法重载只看名称和参数列表,其他的都不看,包括返回值类型、属性修饰符、范围限定等,这些都不影响方法重载的概念。
方法重写可以用“一个前提、三个相同和两个规定”来总结,前提是在继承体系结构下,三个相同代表子类中定义的方法与父类中的方法,具有相同的名字、参数列表和返回值类型,两个规定分别是子类方法的范围限定不能比父类方法的范围小,以及不能抛出更多的异常。当然,final类型的方法和static类型的方法是不能被重写的。
父类定义子类构建还是比较好理解的,但是如果采用了这种定义方式,也就意味着对象本身并不能调用子类独有的方法,而如果调用的方法恰好覆盖了父类中的方法,则还涉及到“虚方法”的概念,实际上执行的是子类方法体中的功能语句。
接口定义实体类构建是Java中非常常见的一种多态形势,而且由于接口属于全抽象方式,所以这种方式可以在很大程度上提升程序的“健壮性”,也是比较推荐的编程方式。采用接口定义类构建的方式,可以在很大程度上提升代码的可复用性。
抽象类定义实体类构建是接口定义方式的一种扩展,通常可以用在代码的模块内部,从而提升代码的内聚性。
指针和引用的区别
(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:
int a=1;int *p=&a;
int a=1;int &b=a;
上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。
而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单元。
(2)引用不可以为空,当被创建的时候,必须初始化,而指针可以是空值,可以在任何时候被初始化。
(3)可以有const指针,但是没有const引用;
(4)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)
(5)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
(6)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。
(7)”sizeof引用”得到的是所指向的变量(对象)的大小,而”sizeof指针”得到的是指针本身的大小;
(8)指针和引用的自增(++)运算意义不一样;
(9)如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄漏;
http和https的区别
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
ssl加密
SSL协议提供的安全通道有以下三个特性:
机密性:SSL协议使用密钥加密通信数据。
可靠性:服务器和客户都会被认证,客户的认证是可选的。
完整性:SSL协议会对传送的数据进行完整性检查。
SSL的握手与密钥协商过程
基于RSA握手和密钥交换的客户端验证服务器为示例详解TLS/SSL握手过程。
TLS/SSL握手过程
(1).client_hello
客户端发起请求,以明文传输请求信息,包含:版本信息,加密套件候选列表,压缩算法候选列表,随机数,扩展字段等信息。
ClientHello 客户发送CilentHello信息,包含如下内容:
(1)客户端可以支持的SSL最高版本号
(2)一个用于生成主秘密的32字节的随机数(random_C)。(用于生成主密钥)
(3)一个确定会话的会话ID。
(4)一个客户端可以支持的密码套件列表。
(5)一个客户端可以支持的压缩算法列表。
(2).server_hello+server_certificate+sever_hello_done
l server_hello
服务端返回协商的信息结果,包括选择使用的协议版本 version,选择的加密套件,选择的压缩算法、随机数 random_S 等,其中随机数用于后续的密钥协商(用于产生主密钥);
l server_certificates
服务器端配置对应的证书链(公钥放在证书中),用于身份验证与密钥交换;
l server_hello_done
通知客户端 server_hello 信息发送结束;
(3).证书校验
客户端验证证书的合法性,如果验证通过才会进行后续通信,否则根据错误情况不同做出提示和操作,合法性验证包括如下:
证书链的可信性、证书是否吊销、有效期 、域名
(4).client_key_exchange+change_cipher_spec+encrypted_handshake_message
l client_key_exchange
合法性验证通过之后,客户端计算产生随机数字 Pre-master,并用证书公钥加密,发送给服务器;
l 此时客户端已经获取全部的计算协商密钥需要的信息:两个明文随机数 random_C 和 random_S 与自己计算产生的 Pre-master,计算得到协商密钥;enc_key=Fuc(random_C, random_S, Pre-Master)
l change_cipher_spec
客户端通知服务器后续的通信都采用协商的通信密钥和加密算法进行加密通信;
l encrypted_handshake_message
结合之前所有通信参数的 hash 值与其它相关信息生成一段数据,采用协商密钥 session secret 与算法进行加密,然后发送给服务器用于数据与握手验证;
(5).change_cipher_spec+encrypted_handshake_message
l 服务器用私钥解密加密的 Pre-master 数据,基于之前交换的两个明文随机数 random_C 和 random_S,计算得到协商密钥:enc_key=Fuc(random_C, random_S, Pre-Master);
l 计算之前所有接收信息的 hash 值,然后解密客户端发送的 encrypted_handshake_message,验证数据和密钥正确性;
l change_cipher_spec
验证通过之后,服务器同样发送 change_cipher_spec 以告知客户端后续的通信都采用协商的密钥与算法进行加密通信;
l encrypted_handshake_message
服务器也结合所有当前的通信参数信息生成一段数据并采用协商密钥 session secret 与算法加密并发送到客户端;
(6).握手结束
客户端计算所有接收信息的 hash 值,并采用协商密钥解密 encrypted_handshake_message,验证服务器发送的数据和密钥,验证通过则握手完成;
(7).加密通信
开始使用协商密钥与算法进行加密通信。
数字证书
数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。数字证书还有一个重要的特征就是只在特定的时间段内有效。
更多面经
扫描二维码
获取更多面经
扶摇就业