Java 基础:
1.public static void main(String[] args)表示程序的入口,JVM在启动时会按照上述签名规则查
找(必须有public,static,void和字符串数组作为方法参数)main方法可以用final,synchronized
修饰,但不可以用abstract。
2.初始化顺序:
先初始化变量后调用构造方法:(1)静态变量先于非静态变量(2)父类先于子类(3)按照定义顺序进行
父类静态变量-父类静态代码块-子类静态变量-子类代码块-父类非静态变量-父类构造方法
-子类非静态变量-子类构造方法
3.构造方法:
构造方法名必须与类具有相同名
可以有多个构造方法,若没有,编译器会提供一个默认的
不能被继承,因此不能被覆盖
4.有些接口没有方法,比如Cloneable,Serializable,起标识作用可以使用instanceof来判断是否是
某一个类型
5.clone()作用:
Object类中提供了一个clone()方法,返回一个新的对象而不是一个引用
使用:实现Cloneable接口(只是标识),覆盖object的clone方法,调用super.clone(),把获得浅
拷贝,赋给引用。
浅拷贝:如果要复制的类只有基本变量则可以使用,若包含对其他对象的引用,则需要对类中其他非基本
类型变量调用clone()方法
6.反射:(1)得到一个对象所属的类
(2)获取一个一个类的所有成员和方法
(3)运行时对类进行装载,创建对象
获得一个class的方法:class.forName(),类名.class,示例.getClass()
7.面向对象的特征
(1)抽象:不考虑一个事物的具体状态,提取出一类事物的共性
(2)继承:对类的重用与扩展,从现有类中派生出一个新的类
(3)封装:对每个类自身的数据进行保护
(4)多态:允许不同类的对象对同一消息作出响应
8.单继承好处:
(1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断
应该使用哪个父类的变量
(2)如果在一个子类继承的多个父类中拥有相同方法,子类中有没有覆盖该方法,那么调用该方法时将产生歧
义,无法判断应该调用哪个父类的方法。
在接口中不能有实例变量,只能有静态的常量,不能有具体的方法(包含方法体),只能有抽象方法,因此也
就摒弃了多继承的缺点。
对于一个类实现多个接口的情况,因为接口只有抽象方法,具体方法只能由实现接口的类实现,在调用的时候
始终只会调用实现类的方法(不存在歧义),因此不存在 多继承的第二个缺点;而又因为接口只有静态的常
量,但是由于静态变量是在编译期决定调用关系的,即使存在一定的冲突也会在编译时提示出错;而引用静态
变量一般直接使用类名或接口名,从而避免产生歧义,因此也不存在多继承的第一个缺点。
9.组合与继承的区别:
组合和继承都允许在新的类中设置子对象,组合是显式的,继承是隐式的
10.多态实现的机制:表示同一个操作作用在不同对象上会有不同的语义
(1)方法的重载:指同一个类中多个同名的方法,根据方法签名不同,在编译时就可以知道调用哪个方法
(2)方法的覆盖:基类或接口的引用可以指向子类或实现类的对象,程序会调用的方法会在运行时动态绑定
11.获取类名:Java语言提供获取类名的方法getClass().getName()
Object类中getClass方法被定义为final和native的,子类不能覆盖
12.this用来指向当前实例对象,用类区分方法形参和成员变量
13.assert作为一种软件调试的方法,提供了一种在代码中进行正确性检查的机制
14.不可变类:创建出这个类的实例后就不可更改它的值了,所有基本类的包装类和String类
字符串的字面量保存在在JVM中的常量区,如多个String对象内容相同则会指向一个常量去中的字面量
在创建一个String对象,先检查常量区中是否已经存在一个相同的字符串被定义,如存在就直接引用
15.Object类中的hashCode()返回的值是对象在内存中的地址的转换成的int值
16.异常处理:
finally部分一定会在return之前执行,如果在finally中也有return则会覆盖其他部分的return内容
两种finally中内容不执行
(1)try之前出现异常程序退出
(2)在try之中强制退出,System.exit(0)
17.异常:
两类错误异常Error,Exception
Error是属于JVM层次的错误,会导致程序终止,比如OutOfMemoryError和ThreadDeath
Exception表示可以恢复的异常,编译器可以捕捉到,包含两类检查异常和运行时异常
(1)检查异常:比如IO异常和Sql异常,这种异常发生在编译阶段,Java编译器强制捕获此异常,可以
放入try块中,并会不会导致后续程序无法执行
(2)运行时异常:出现这种异常会由JVM处理,如NullPointerException,ArrayIndexOfBounds
Exception。出现异常时回一层一层向上抛出,最终导致程序退出或线程终止
18.Java socket:
网路上的两个程序可以通过一个通信连接来实现数据交换,可以分为面向连接的Socket,使用TCP和面向无
连接的Socket,使用UDP
TCP过程:
(1)Server监听某个端口,是否有连接请求
(2)客户端向Server发出连接请求
(3)Server向客户端发出Accept接受消息,就建立好了连接
(4)交换数据
19.Java NIO
20.Java内存泄露:
(1)静态集合类,例如HashMap,如果这些容器是静态的,那么他们的生命周期就和应用是一致的,那容器中
的对象就没办法释放
(2)使用连接后不关闭,如数据库连接
21.实现Java多线程的3中方法
(1)继承Thread类,重写run()
Thread本身就实现了Runnable接口,start()方法是native方法他将启动一个线程并执行run()方法
(2)实现Runnable接口
(3)实现Callable接口,与Runnable相比,可以有返回值并且可以抛出异常,run不行
start()来启动一个线程,此时线程处于就绪状态,其执行由系统来调度,run()表示实际完成的操作
22.Lock
(1)lock()获取到锁就返回,负责等待
(2)tryLock()尝试一下,获取不到就返回false
(3)tryLock(long time)等待一段时间,获取不到就返回false
(4)lockInterruptibly()获取不到就等待,可以响应中断
23.sleep与wait区别:
(1)原理不同:sleep是Thread类的静态方法,是线程用来控制自身流程的。wait是Object类的方法,用
于进程间通信
(2)对锁的处理方式不同:sleep不会释放锁,wait会暂时释放对象锁
(3)使用区域不同:sleep可以在任何地方使用,wait必须在同步区中
24.synchronized与lock区别:
(1)用法不一样:synchronized可以用于代码块和方法,lock需要显示地指定起始位置
(2)lock功能更多,可以在使用非阻塞的方式去获取锁
25.通过JDBC访问数据库:
(1)加载JDBC驱动器:将JDBC驱动复制到WEB-INF/lib
(2)加载JDBC驱动,并将其注册到DriverManager中
(3)获得Connection连接
(4)建立PreparedStatement对象
(5)执行SQL
(6)访问ResultSet
(7)关闭连接(因为Jdbc连接池中连接数量有限,所以非常重要)
26.Statement,PreparedStatement与CallableStatement有什么区别:
(1)Statement用于执行不带参数的sql,每次执行sql语句时都要编译
(2)PreparedStatement执行带参数的sql,可以进行预编译,放到命令缓存区,防止sql注入
(3)CallableStatement可以使用数据库中存储过程
27.JDBC与Hibernate区别:
Hibernate是对JDBC的封装,采用配置文件的方式将数据库的连接参数写入xml文件中。
Hibernate是一个持久层框架,将数据库中表的信息映射到xml文件中,再从XML文件中映射到相应的类中。
28.Servlet:采用Java语言编写的服务器端程序,运行于web服务器中servlet容器中。
执行过程:
(1)用户向Servlet发起请求
(2)Web服务器接到请求后会把请求交给容器,容器发现这是对servlet的请求,又会交给servlet处理
(3)找到对应的servlet创建新的线程
(4)调用service处理
(5)将结果组装好返回给客户端
29.servlet生命周期:init、service、destroy
30.JSP与Servlet区别:
(1)Servlet的缺点是必须把给用户的响应视图组装成一个很长的Html文本,jsp解决了这个问题
(2)Servlet是Java代码中嵌套Html,Jsp是在Html代码中嵌套Java
(3)Servlet没有内置对象,必须通过HttpServletRequest,HttpServletResponse,HttpServlet
获得
31.MVC模型:低耦合行,可扩展,便于维护
(1)Model层:Service类和Dao类处理数据逻辑和存储数据
(2)View层:JSP负责展示界面和响应用户指令
(3)Controller:Servlet负责决定是哪个模型层类处理事件,并且决定返回哪个页面
32.Servlet的Forward和Redirect区别:
forward是服务器内部的跳转,用于转到不同的servlet
redirect是客户端的跳转,客户端浏览器会现实跳转后的地址
33.JSP内置对象
(1)request:客户端的请求,可以用于获取参数
(2)response
(3)pageContext:可以访问当前页面所有对象
(4)session:HttpSession实例,表示从客户端与服务器端建立连接到关闭浏览器
(5)application:属于web应用,可以存放全局变量
(6)out:JspWriter实例,可以在客户端浏览器输出
34.JSP动作:
(1)jsp:include 用于引入一个页面,运行时动态引入;<@ include指令,在编译时引入,
(2)jsp:useBean,用类实例化一个JavaBean对象
(3)jsp:set/getProperty为javabean对象设置和读取属性
35.Ajax:异步javascript和xml
在不刷新页面的情况下通过与服务器进行少量的数据交互来提高页面的交互性,减少响应时间
Ajax是客户端技术,核心是JavaScript对象XmlHttpRequest,是一种异步请求技术,使得JavaScript
向服务器提出请求并处理响应,而不阻塞用户
36.cookie和session区别:
cookie和session都是用来跟踪浏览器用户身份的会话方式,但cookie数据保存在客户端,session数据
保存在服务器端。session比cookie能存储更多的内容,cookie和session都可以存储用户信息,比如用
户名和密码,但存储在session中更安全,cookie中可以存储sessionId字段。
37.数据库连接池
对数据库连接管理会影响整个应用的性能
(1)建立数据库连接是耗时的操作,如果每次用户请求都需要建立数据库连接,则会影响用户体验
(2)数据库连接数量有限,如果使用完后忘记释放连接酒会造成数据库连接资源的耗尽
数据库连接池负责分配、管理和释放数据库连接,允许应用程序重复使用一个现有的数据库连接。
在服务器启动时,会在连接池中创建一定数量的数据库连接,当用户需要使用时,从池中拿一个,使用完再放
回。当池中没有可用的时候,会根据配置参数再创建连接,当连接池中某一连接长时间(超过最大空闲时间)未
使用则连接池负责关闭连接释放资源。