1. 面向对象的特征
面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段的产物。
面向对象的4大特征:抽象、封装、继承、多态
-
抽象:是对现实世界理解和抽象,将一类对象的共同特征总结抽取,只关注对象的属性、行为。
比如“人”,这一对象,如何抽象呢?
属性:姓名、性别、年龄等等。
行为:行走、跑步、吃饭等等。
那么我们就可以将现实世界中的“人”,抽象为一个具有
name、sex、age
属性、walk()、run()、eat()
行为的human
对象。 -
封装:是将具体细节隐藏,只提供最简单的访问接口。
还是以“人”举例,“人”的减肥行为,需要“管住嘴,迈开腿”,意思就是控制饮食,跑步,具体如何控制饮食,如何跑步,快跑慢跑,我们将控制饮食封装在
eatLess()
方法内,跑步封装在run()
。那么只需调用eatLess()和run()
,即可完成减肥行为。这时,将减肥行为封装为loseWeight()
方法,当其他人需要减肥时,只需调用loseWeight()
方法,隐藏了内部具体操作。 -
继承:是子类可以直接使用父类的部分数据和方法。
还是以“人”举例,上面抽象的时候,将“人”抽象为一个具有
name、sex、age
属性、walk()、run()、eat()
行为的human
对象。“人”可以分为“成年人”、“未成年人”,那么“成年人”、“未成年人”就可以继承“人”的属性和行为,并增加相对应的字段。
“成年人” extend “人”:具有“人”的所有属性和行为,同时可以新增属性:工作。
“未成年人” extend “人”:具有”人“的所有属性和行为,同时可以新增属性:年级。
-
多态:同一类的对象调用相同方法可以表现出不同的行为,它的前提是封装形成独立体,独立体之间存在继承关系,从而产生多态机制。多态是同一个行为具有多个不同表现形式或形态的能力。。
还是以“人”举例,“成年人”、“未成年人”继承了“人”,可以在继承的类中,重写父类方法。如在继承的类实现不同的
eat()
,“成年人”的eat()
为2份,“未成年人”的eat()
为1份,虽然二者都是eat()
行为,但二者的eat()
行为是不同的。
2. final finally finalize的区别
-
final
:关键字,用来修饰类的属性、方法的参数、方法、类。- 修饰类的属性:属性不可变。
- 修饰方法的参数:属性不可变。
- 修饰方法:方法不可被覆盖。
- 修饰类:类不可被继承
-
finally
:关键字,与try{}catch
代码块搭配使用,如论try
是否捕获异常,finally
始终会被执行到。finally在代码块return前执行。 -
finalize
:方法,是Object类的方法,目的是为了清理对象所占资源。在垃圾回收时调用被回收对象的finalize()
。
3. int和Integer的区别
int:Java八大基本数据类型的一种。默认值0。
Integer:int的包装类,必须实例化后才能使用。默认值null。
这里涉及到“自动装箱、自动拆箱”的概念。
它是由Java提供的“语法糖”,保证不同的写法在运行时等价。
自动拆箱:自动将包装类对应的基本类型的值返回出来。发生在:包装类给基础类赋值、传承、比较、运算
自动装箱:自动将基本类型转换为对应的包装类。**装箱涉及缓存问题,如果值在缓存中,则取缓存中的值,不会新建对象。**发生在:基础类给包装类赋值、传承
4. 重载和重写的区别
-
重载:类中,方法名字相同,参数不同,返回类型可以相同、可以不同。最常见的是构造器的重载。
-
重写:子类重写父类方法。子类对父类的允许访问的方法的实现过程进行重新编写,返回值和行参都不能改变。
5. 抽象类和接口的区别
-
抽象类:
abstract
修饰。为了继承而存在。- 不能被实例化,只能被继承
- 不一定含有抽象方法,包含抽象方法的一定是抽象类
- 抽象方法修饰符只能为:
public
或protected
- 子类继承抽象类,子类必须实现抽象类的抽象方法,否则子类必须也为抽象类
- Java中仅支持单一继承,不支持多继承。
-
接口:
interface
修饰。供外部调用,是对行为的抽象。- 变量隐式定义为:
public static final
,方法隐式定义为:public abstract
- 接口支持继承多个接口
- 类可以实现多个接口
- 变量隐式定义为:
6. 反射的用途及实现
- 用途:通过反射机制,运行期间获取对象的类型信息。实现动态获取(运行时获取对象的属性和方法)、动态调用(运行时调用对象的方法)
- 实现:3种获取对象反射的反射类
对象.getClass()
Class.forName(类路径)
类名.class
7. 自定义注解的场景及实现
Java语言中的类、方法、变量、参数和包等都可以被标注。和Javadoc不同,Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java虚拟机可以保留标注内容,在运行时可以获取到标注内容。当然它也支持自定义Java标注。
8. HTTP请求GET和POST的区别
HTTP:超文本传输协议(HTTP),客户端-服务器之间的请求-应答协议。
GET:从指定资源请求数据。
POST:向指定资源提交被处理的数据。
区别:
一、URL
- GET请求参数附在URL后,以
?
分割URL和参数,多个参数使用&
分割。URL编码采用ASCII
编码。 - POST请求参数在HTTP请求包的包体中,URL不可见。
二、传输数据大小限制
- GET请求是对URL添加参数,对于特定的浏览器和服务器会对URL的长度有限制。
- POST请求参数在HTTP请求包的包体中,一般不会收到浏览器限制,但可能收到服务器的限制。
三、安全性
- GET请求URL会暴露数据,浏览器缓存可能暴露重要数据。同时可能会有“跨站脚本攻击”
9. session和cookie的区别
先了解session和cookie为何物
session和cookie都是一种会话控制技术,存储会话信息的技术。类似于现实世界中的“钥匙”,钥匙控制人与房间的关联,人只有通过正确的钥匙才能进入正确的房间。
为何需要Session和Cookie这样的钥匙
HTTP协议是一种无状态的协议。相同两次请求,服务器无法判定请求和之前请求的关系。那么试想下,当登录一个网站后,在网站进行其他操作,服务器如何才能鉴别该操作是登录后的操作还是未登录的操作呢?这时候使用Session
或Cookie
技术,就能够让服务器鉴别出此行为。
Session技术
Session技术是在服务端创建sessionId
的空间进行存储会话信息,通过该存储信息鉴别请求。(Session存活时间较短,大部分为30分钟内)
1.客户端发起请求建立连接
2.服务端创建sessionId
对应存储信息,相应数据返回sessionId
给客户端
3.客户端存储该sessionId
,在往后的请求中携带该sessionId
。在sessionId
失效后,请求将会被拦截,以确保房间不会被外人进入。
Cookie技术
Cookie技术是在客户端存储会话信息,通过该存储信息鉴别请求。(一般关闭浏览器,清除缓存Cookie数据清空)
1.客户端发起HTTP请求
2.服务端创建Cookie
指令,相应客户端
3.客户端创建Cookie
并保存数据,在往后的请求中携带该Cookie
。
Session与Cookie区别
1.存储数据位置不同:Session存储在服务器,Cookie存储在客户端。
2.对服务器的压力不同:由于存储位置的不同,在高并发下,Session导致服务器压力大。
3.安全性不同:Session存储在服务器,不容易被窃取。Cookie存储在客户端,容易被窃取并产生跨站攻击。
4.存储数据大小不同:Session存储在服务器,根据服务器硬盘限制;Cookie存储在客户端,文本形式(小于4KB)。
10. session分布式处理
如上,
SessionId
在单机版的服务器上是不会有问题的。但是在分布式情况下,多台服务器间如何解决Sesssion
一致性的问题?
-
方案1:Session粘性
简单来说就是将请求锁定到一台服务器上。
具体实现:利用
Nginx
反向代理,代理多台服务器,采用ip_hash的负载策略,将客户端和服务器进行绑定。这样就不存在Session不一致问题。缺点:**ip_hash无法保证后端负载均衡!!!**一旦服务器故障,Session会丢失。
-
方案2:服务器Session复制
将服务器的Session发生改变的节点广播给其他节点,实现复制效果,以此保证不同服务器Session同步。
缺点:广播会占用一定网络,一旦Session需要广播的数据量大,会造成网络堵塞,影响整体性能。
-
方案3:Session集中管理
将所有服务器的Session统一管理,如redis进行管理Session。
-
更多方案
https://www.cnblogs.com/fengyun2050/p/15753966.html
11. MVC设计思想
什么是MVC
MVC:M-Model模型、V-View-视图、C-Controller-控制器。是程序的架构模式的一种。将程序的输入、处理、输出按照M-C-V进行分层设计。
- Model模型:核心层,程序需要的数据或信息。
- Controller控制器:控制层,根据View视图层的输入,选取Model模型层的模型,进行相应的处理。
- View视图:提供输入以及展现Controller处理结果。
这三层是紧密联系,却又相互独立,达到了软件开发中的高内聚,低耦合的设计理念。
可参考阮一峰的 谈谈MVC模式:http://www.ruanyifeng.com/blog/2007/11/mvc.html
12. equals和==的区别
两者都是实现比较功能,但equals
是方法,==
是运算符。
具体区别:
equals
- 类没有重写
Object.equals()方法
:比较对象的内存地址,等价于使用==
进行比较 - 类重写
Object.equals()
方法:常用的String.equals比较的是对象的值
- 类没有重写
==
- 基本数据类型:比较对象的值
- 引用数据类型:比较对象的内存地址