基础篇
面向对象的特征
封装、继承 、抽象、多态等4个主要的特征:
- 封装:
封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位。原则就是把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法和它操作的数据放在同一个类中。 - 继承:
再定义一个对象或方法的时候,可以在一个已经存在的对象中增加或修改其方法,在其父对象的基础上,实现更具体的功能。 - 抽象
抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面,提取出共性特点。 多态
多态性增强了软件的灵活性和扩展性,定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定。在对象方法中的体现是,同一个方法名,可以处理不同的类型的参数,执行不同的处理程序,也可以得到不同类型的结果。final, finally, finalize 的区别
- final
final关键字可以用来修饰类、方法和变量
final修饰类的时候,表示该类不能作为其他类的父类。
final修饰方法的时候,表示该方法不能被子类重写或覆盖。但是加上private关键字就可以被子类重写,因为加了private,该方法不会被子类感知到。
final修饰变量的时候,该变量不能被修改,可以看作是常量,必须在定义时或者构造器中进行初始化赋值,只能被赋值一次,赋值后值不再改变。虽然final指定的变量是不能改变的,但是如果final指定的是引用变量,它指向对象的内容可以改变。
如果final修饰的是参数,说明这个参数也不能改变。 - finally
finally是Java异常处理中的关键字。一般使用的时候格式为
try{ //todo }catch(Exception e){ //todo }finally{ //todo }
一般情况下,不管try中的代码块是否执行成功,finally总会执行。但是有几个例外,比如在try代码块中加入了System.exit(0);
直接结束虚拟机的运行,就不能继续执行下去了。
try{ return 0; }catch(Exception e){ return 1; }finally{ return 2; }
在上面这个代码中,返回的结果为2,而不是0,如果try代码块中包含有return返回值,那么程序限制为先执行finally,再继续执行try中的return语句,所以再finally中直接返回了返回值为2;
finalize
垃圾回收器要回收对象的时候,首先要调用这个类的finalize方法(你可以 写程序验证这个结论),一般的纯Java编写的Class不需要重新覆盖这个方法,因为Object已经实现了一个默认的,除非我们要实现特殊的功能(这 里面涉及到很多东西,比如对象空间树等内容)。int 和 Integer 有什么区别
Integer是int的包装类,int则是java的一种基本数据类型。两个New出来的Integer是能用“==”做比较的,因为两个对象的地址是不一样的,具体的比较如下:
Integer i = new Integer(100); Integer j = new Integer(100); System.out.println(i == j); //false Integer i1 = 100; Integer j1 = new Integer(100); System.out.println(i1 == j1); //false Integer i2 = 100; Integer j2 = 100; System.out.println(i2 == j2); //true Integer i3 = 150; Integer j3 = 150; System.out.println(i3 == j3); //false
最后一条的原因是Integer=100
在编译的时候会翻译成为Integer i = Integer.valueOf(100);
;在值-128到127之间,valueOf是有缓存的,所以不需要new Integer();过了127之后,就开始新建对象了。源码如下:
public static Integer valueOf(int i){ assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high){ return IntegerCache.cache[i + (-IntegerCache.low)]; } return new Integer(i); }
重载和重写的区别
- 重载:子类把父类已有的方法重新实现一遍。
重写:同一个方法名,写多个方法,可以接收不同类型和个数的参数,返回不同类型的结果。
可以认为都是多态的实现方式,一个是编译时的多态,一个是运行时的多态。抽象类和接口有什么区别
- 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
- 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
一个类只能继承一个抽象类,而一个类却可以实现多个接口。
说说自定义注解的场景及实现
- 元注解
元注解是负责修饰其他注解的注解,有四个。
@Target
@Retention
@Documented
@Inherited
- 基本注解
@Override,表示当前的方法定义将覆盖超类中的方法。
@Deprecated,不赞成使用的代码,被弃用的代码。
@SuppressWarnings,关闭不当编辑器警告信息。
自定义注解的意义
注解,顾名思义为注释或解释,可以放在类前,方法前,变量前。通过反射机制,可以向获取方法,变量一样获取对象的注解信息中的值,完成特定的功能。一般来说,配合一些方法的监听器,可以在执行方法的时候,完成一些操作,比如springmvc在切面上配合自定义的注解来进行Log日志记录,redis存取等,在MongoDB中,要实现自增ID的话,可以写一个自定义的变量注解,监听MongoDB的保存服务方法,在保存之前查询ID的最大值并进行自增操作,然后把值赋给ID,这些操作不使用注解一样可以实现,但是注解可以实现得更加简洁。
HTTP 请求的 GET 与 POST 方式的区别
- GET - 从指定的资源请求数据。
- POST - 向指定的资源提交要被处理的数据
session 与 cookie 区别
session和cookie都是会话管理工具,session保存在服务器端。
- cookie保存在客户端(浏览器中),若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。
若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在浏览器的不同进程间共享。cookie跨域名不可用。 - 每个用户访问服务器都会建立一个session,session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。事实上,用户与服务器建立连接的同时,服务器会自动为其分配一个SessionId,一般sessionID存储在cookie中,如果禁用cookie的话,就必须在URL后加上sessionID或者在请求数据中加入sessionID让后台继续使用session。
session 分布式处理
session的分布式管理一般有一下几种形式:
第一种:Nginx中设置,让每次请求的机器都是同一台
第二种:tomcat中配置,进行session复制
第三种:session存入到redis等缓存中
JDBC 流程
- 完整的流程如下
- 加载Driver类,注册驱动
- 通过DriverManager,使用url,用户名和密码建立连接
- 通过Connection,使用sql语句打开Statement对象
- 执行sql文件
- 关闭资源
由于数据库的连接和释放比较占性能,尤其是在高并发的情况下,如果每次都去建立数据库连接就会有性能问题,也会影响一个应用程序的延展性,所以要使用连接池,连接池一般还可以控制同时访问数据库的数量,超过的访问放入队列进行等待。
- tomcat中使用连接池的步骤
- 要配置一下常用参数(最大,最小连接数,连接超时时间,重试次数等)
- 配置相应的数据源
- 使用提供的API方法进行访问数据库
- 需要注意的问题
- 事务处理
MVC 设计思想
- MVC模式
M:用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。
V:视图层负责数据的展示
C:控制器是M和V之间的连接器,用于控制应用程序的流程。它处理事件并作出响应。“事件”包括用户的行为和数据模型上的改变。
上面的mvc是比较传统的业务分层,里面的视图层是后台根据controller层得出的数据渲染出来的,在SpringMVC中的Service层处于Controller和Model之间,还是属于MVC中的C层,是为了方便服务的复用,将其单独抽离出来了,但是现在一般采用前后端分离的模式进行开发的话,属于REST模式。因为视图层都没有了,浏览器接受Controller产生的数据,在浏览器中进行渲染。
equals 与 == 的区别
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。 equals用来比较两个类的时候,需要实现equals()方法,如果不实现该方法,默认返回为false,那么是不想等的。