1. 接口和抽象类的区别
(1)除默认方法外的所有方法在接口中不能有实现(jdk1.8才有的default修饰的默认方法),而抽象类可以有非抽象的方法。
(2)接口中除了static、final变量,不能有其他变量,而抽象类中则不一定。
(3)一个类可以实现多个接口,但只能实现一个抽象类。接口自己本身可以通过extends关键字扩展多个接口。
(4)接口方法默认修饰符是public,抽象方法可以有public、protected和default这些修饰符(抽象方法就是为了被重写所以不能使用private关键字修饰!)。
(5)从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。
2. 成员变量与局部变量的区别
(1)从语法形式上看:成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰。
(2)从变量在内存中的存储方式来看:如果成员变量是使用static修饰的,那么这个成员变量是属于类的,如果没有使用static修饰,这个成员变量是属于实例的。而对象存在于堆内存,局部变量则存在于栈内存。
(3)从变量在内存中的生存时间上看:成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失。
(4)成员变量如果没有被赋初值:则会自动以类型的默认值而赋值(一种情况例外:被 final 修饰的成员变量也必须显式地赋值),而局部变量则不会自动赋值。
3. 父类需要定义空构造函数的目的为了防止当子类构造函数调用super()时由于父类没有空构造函数而导致的报错
4. 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是帮助子类做初始化工作。
5. 两个对象有相同的hashcode值,它们也不一定是相等的
6. final关键字用于变量、方法和类时的用处
(1)当用final修饰变量时,该变量不能被更改,也就不能再指向其他对象
(2)当用final修饰类时,该类不能被继承。final类中的所有成员方法都被隐式的定义成final方法
(3)当修饰final方法时,第一个作用是可以使其不能被重写,即不能被更改,第二个作用是为了提升效率,在早期的Java实现版本中,会将final方法转为内嵌调用(现在的Java版本不需要这些优化了)。类中所有的private方法都隐式地指定为final。
7. finally块的代码哪些情况下不被执行
(1)在finally语句块第一行发生了异常。 因为在其他行,finally块还是会得到执行。
(2)System.exit:System.exit()的作用是中止当前虚拟机,虚拟机都被中止了,finally代码块自然不会执行。
(3)finally所在的线程终止时:如当JVM中的所有非守护线程执行完后,守护(daemon)线程被终止,导致守护线程中的finally块不能被执行
(4)关闭CPU
(5)注意: 当try语句和finally语句中都有return语句时,在方法返回之前,finally语句的内容将被执行,并且finally语句的返回值将会覆盖原始的返回值。
8. transient关键字
transient只能修饰变量,不能修饰类和方法。能够使得被此关键字修饰的变量不被序列化。当对象被反序列化时,该关键字修饰的变量值不会被持久化或恢复。
9. 获取键盘输入常用的两种方法
(1)通过Scanner
Scanner input = new Scanner(System.in);
String s = input.nextLine();
input.close();
(2)通过BufferedReader
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String s = bufferedReader.readLine();
10. 父类和子类静态代码块、非静态代码块、构造函数(方法)执行的先后顺序问题
(1)静态代码块总是最先执行的。
(2)子类和父类的静态代码块都执行完之后,再执行父类的非静态代码块和父类的构造方法,最后执行子类的非静态代码块和构造方法。
11. 静态内部类与非静态内部类之间存在一个最大的区别:
非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着:1.它的创建是不需要依赖外围类的创建。2.它不能使用任何外围类的非static成员变量和方法。
12. 使用this和super需要注意的事项
在构造器中使用super()调用父类中的其他构造方法时,该语句必须处于构造器的首行,否则编译器会报错。另外,this 调用本类中的其他构造方法时,也要放在首行。this、super不能用在static方法中。(被 static修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享。而 this 代表对本类对象的引用,指向本类对象;而super代表对父类对象的引用,指向父类对象;所以,this和super是属于对象范畴的东西,而静态方法是属于类范畴的东西。)
13. Get和Post的区别
(1)GET产生一个TCP数据包,POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
(2)GET与POST都有自己的语义,不能随便混用。
(3)据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
(4)并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
(5)Get和Post区别知乎解答
14. 转发(Forward)和重定向(Redirect)的区别
(1)转发是服务器行为,重定向是客户端行为。重定向(Redirect) 是利用服务器返回的状态码来实现的。客户端浏览器请求服务器的时候,服务器会返回一个状态码。服务器通过 HttpServletResponse 的 setStatus(int status) 方法设置状态码。如果服务器返回301或者302(解释如下),则浏览器会到新的网址重新请求该资源。转发(forword)代码如下:
request.getRequestDispatcher("login_success.jsp").forward(request, response);
(2)从地址栏显示来说: forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址。redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL。
(3)从数据共享来说: forward:转发页面和转发到的页面可以共享request里面的数据。redirect:不能共享数据。
(4)从运用地方来说: forward:一般用于用户登陆的时候,根据角色转发到相应的模块。redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等。
(5)从效率来说: forward:效率高,redirect:效率低。
15. 重定向中状态码301和302的区别
(1)301永久重定向:
当浏览器接收到服务端301(永久)重定向返回码时,会将original_url和redirect_url1存储在浏览器缓存中,当再次请求original_url时,浏览器会从本地缓存中读取redirect_url1直接进行跳转,不再请求服务端。在浏览器未清理缓存或缓存未失效的情况下,即使服务端将重定向地址修改为redirect_url2,浏览器依然会跳转到redirect_url1。
(2)302重定向:
当浏览器接收到服务端302(临时)重定向返回码时,不会进行缓存。每次请求original_url时,都会请求一下服务端。
16. Servlet和JSP的不同
Servlet是一个特殊的Java程序,它运行于服务器的JVM中,能够依靠服务器的支持向浏览器提供显示内容。JSP本质上是Servlet的一种简易形式,JSP会被服务器处理成一个类似于Servlet的Java程序,可以简化页面内容的生成。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。有人说,Servlet就是在Java中写HTML,而JSP就是在HTML中写Java代码,当然这个说法是很片面且不够准确的。JSP侧重于视图,Servlet更侧重于控制逻辑,在MVC架构模式中,JSP适合充当视图(view)而Servlet适合充当控制器(controller)。JSP会在客户端第一次请求JSP文件时被编译为HttpJspPage类(接口Servlet的一个子类)
17. 讲解JSP中的四种作用域
JSP中的四种作用域包括page、request、session和application,具体来说:
(1)page代表与一个页面相关的对象和属性。
(2)request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。
(3)session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。
(4)application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。
18. 如何实现JSP或Servlet的单线程模式
(1)对于JSP页面,可以通过page指令进行设置。
<%@page isThreadSafe="false"%>
(2)对于Servlet,可以让自定义的Servlet实现SingleThreadModel标识接口。
**说明:**如果将JSP或Servlet设置成单线程工作模式,会导致每个请求创建一个Servlet实例,这种实践将导致严重的性能问题(服务器的内存压力很大,还会导致频繁的垃圾回收),所以通常情况下并不会这么做。
19. 实现会话跟踪的技术有哪些
(1)使用Cookie
向客户端发送Cookie
Cookie c =new Cookie("name","value"); //创建Cookie
c.setMaxAge(60*60*24); //设置最大时效,此处设置的最大时效为一天
response.addCookie(c); //把Cookie放入到HTTP响应中
从客户端读取Cookie
String name ="name";
Cookie[]cookies =request.getCookies();
if(cookies !=null){
for(int i= 0;i<cookies.length;i++){
Cookie cookie =cookies[i];
if(name.equals(cookis.getName()))
//something is here.
//you can get the value
cookie.getValue();
}
}
优点: 数据可以持久保存,不需要服务器资源,简单,基于文本的Key-Value
缺点: 大小受到限制,用户可以禁用Cookie功能,由于保存在本地,有一定的安全风险。
(2)URL重写
在URL中添加用户会话的信息作为请求的参数,或者将唯一的会话ID添加到URL结尾以标识一个会话,如在URL后面加入userId=1 之类的。
优点: 在Cookie被禁用的时候依然可以使用
缺点: 必须对网站的URL进行编码,所有页面必须动态生成,不能用预先记录下来的URL进行访问。
(3)隐藏的表单域
<input type="hidden" name ="session" value="..."/>
优点: Cookie被禁时可以使用
缺点: 所有页面必须是表单提交之后的结果。
(4)HttpSession
向在所有会话跟踪技术中,HttpSession对象是最强大也是功能最多的。当一个用户第一次访问某个网站时会自动创建 HttpSession,每个用户可以访问他自己的HttpSession。可以通过HttpServletRequest对象的getSession方 法获得HttpSession,通过HttpSession的setAttribute方法可以将一个值放在HttpSession中,通过调用 HttpSession对象的getAttribute方法,同时传入属性名就可以获取保存在HttpSession中的对象。与上面三种方式不同的 是,HttpSession放在服务器的内存中,因此不要将过大的对象放在里面,即使目前的Servlet容器可以在内存将满时将HttpSession 中的对象移到其他存储设备中,但是这样势必影响性能。添加到HttpSession中的值可以是任意Java对象,这个对象最好实现了 Serializable接口,这样Servlet容器在必要的时候可以将其序列化到文件中,否则在序列化时就会出现异常。
Cookie和Session的的区别
Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。
(1)Cookie 一般用来保存用户信息;比如①我们在 Cookie 中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了;②一般的网站都会有保持登录也就是说下次你再访问网站的时候就不需要重新登录了,这是因为用户登录的时候我们可以存放了一个 Token 在 Cookie 中,下次登录的时候只需要根据 Token 值来查找用户即可(为了安全考虑,重新登录一般要将 Token 重写);③登录一次网站后访问网站其他页面不需要重新登录。
(2)Session 的主要作用就是通过服务端记录用户的状态。 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。
(3)Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。
(4)Cookie 存储在客户端中,而Session存储在服务器上,相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。