一、接口和抽象类的区别是什么?
- 抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
- 抽象类要被子类继承,接口要被类实现。
- 接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现。
- 接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
- 抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
- 抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果。
- 抽象类里可以没有抽象方法。
- 如果一个类里有抽象方法,那么这个类只能是抽象类
- 、抽象方法要被实现,所以不能是静态的,也不能是私有的。
- 接口可继承接口,并可多继承接口,但类只能单根继承。
二、什么是值传递和引用传递?
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。
引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。
三、线程有几种创建方式,你喜欢哪种,为什么?
- 继承Thread类(真正意义上的线程类),是Runnable接口的实现。
- 实现Runnable接口,并重写里面的run方法。
- 使用Executor框架创建线程池。Executor框架是juc里提供的线程池的实现。
调用线程的start():启动此线程;调用相应的run()方法
继承于Thread类的线程类,可以直接调用start方法启动线程(使用static也可以实现资源共享).一个线程(对象)只能够执行一次start(),而且不能通过Thread实现类对象的run()去启动一个线程。
实现Runnable接口的类需要再次用Thread类包装后才能调用start方法。(三个Thread对象包装一个类对象,就实现了资源共享)。
(补充)线程的使用的话,注意锁和同步的使用。(多线程访问共享资源容易出现线程安全问题)
一般情况下,常见的是第二种。
Runnable接口有如下好处:
1、避免点继承的局限,一个类可以继承多个接口。
2、适合于资源的共享
四、什么是数据库的连接池?
连接池用于创建和管理数据库连接的缓冲池技术,缓冲池中的连接可以被任何需要他们的线程使用。当一个线程需要用JDBC对一个数据库操作时,将从池中请求一个连接。当这个连接使用完毕后,将返回到连接池中,等待为其他的线程服务。
连接池的主要优点有以下三个方面。
第一、减少连接创建时间。连接池中的连接是已准备好的、可重复使用的,获取后可以直接访问数据库,因此减少了连接创建的次数和时间。
第二、简化的编程模式。当使用连接池时,每一个单独的线程能够像创建一个自己的JDBC连接一样操作,允许用户直接使用JDBC编程技术。
第三、控制资源的使用。如果不使用连接池,每次访问数据库都需要创建一个连接,这样系统的稳定性受系统连接需求影响很大,很容易产生资源浪费和高负载异常。连接池能够使性能最大化,将资源利用控制在一定的水平之下。连接池能控制池中的连接数量,增强了系统在大量用户应用时的稳定性。
五、Servlet是什么?
servlet是一个基于java技术的WEB组件,运行在服务器端,我们利用 sevlet可以很轻松的扩展WEB服务器的功能,使它满足特定的应用需要。servlet由servlet容器管理,servlet容器也叫 servlet引擎,是servlet的运行环境,给发送的请求和响应之上提供网络服务。比如tomcat就是我们常用的一个servlet容器,其接受 客户端并做出响应的步骤如下:
1、客户端访问WEB服务器,发送HTTP求
2、WEB服务器接收到请求后,传递给servlet容器
3、servlet容器加载servlet,产生servlet实例,并向其传递表示请求和响应的对响
4、servlet得到客户端的请求信息,并进行相应的处理
5、servlet实例把处理结果发送回客户端,容器负责确保响应正确送出,同时将控制返回给WEB服务器
六、简述一下servlet的生命周期;
- 创建Servlet对象,通过服务器反射机制创建Servlet对象,第一次请求时才会创建。
- 调用Servlet对象的init()方法,初始化Servlet的信息,init()方法只会在创建后被调用一次;
- 响应请求,调用service()或者是doGet(),doPost()方法来处理请求,这些方法是运行的在多线程状态下的。
- 在长时间没有被调用或者是服务器关闭时,会调用destroy()方法来销毁Servlet对象。
- -
七、doPost()和doGet()方法的区别;
get和post是http协议的两种方法。
这两种方法有本质的区别,get只有一个流,参数附加在url后,大小个数有严格限制且只能是字符串。post的参数是通过另外的流传递的,不通过url,所以可以很大,也可以传递二进制数据,如文件的上传。
在servlet开发中,以doGet()和doPost()分别处理get和post方法。
首先判断请求时是get还是post,如果是get就调用doGet(), 如果是post就调用doPost()。都会执行这个方法。
1.doGet()
GET调用用于获取服务器信息,并将其做为响应返回给客户端。当经由Web浏览器或通过HTML、JSP直接访问Servlet的URL时,一般用GET调用。GET调用在URL里显示正传送给SERVLET的数据,这在系统的安全方面可能带来一些问题。2.doPost()
它用于客户端把数据传送到服务器端,也会有副作用。但好处是可以隐藏传送给服务器的任何数据。Post适合发送大量的数据。
八、HTTP响应的结构是什么?
HTTP响应由三个部分组成:
状态码(Status Code):描述了响应的状态。可以用来检查是否成功的完成了请求。请求失败的情况下,状态码可用来找出失败的原因。如果Servlet没有返回状态码,默认会返回成功的状态码HttpServletResponse.SC_OK。
HTTP头部(HTTP Header):它们包含了更多关于响应的信息。比如:头部可以指定认为响应过期的过期日期,或者是指定用来给用户安全的传输实体内容的编码格式。
主体(Body):它包含了响应的内容。它可以包含HTML代码,图片,等等。主体是由传输在HTTP消息中紧跟在头部后面的数据字节组成的。
- -
九、Cookie是什么?说说cookie和session的区别;
Cookies是指服务器暂存放在你的电脑里的txt格式的文本文件资料,主要用于网络服务器辨别电脑使用。通俗的说,Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术。Cookies是当你浏览某网站时,由Web服务器置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息,以便于下次登陆的时候,会提示您曾经输入的用户名,甚至密码等。
cookie 和session的区别是:cookie数据保存在客户端,session数据保存在服务器端。
十、Jsp的隐含对象是什么?有哪几个?
out :来源于java.io.Writer类,它用于发送输出流到客户端。
request: 来源于javax.servlet.http.HttpServletRequest接口。它被关联到每一个HTTP请求。
response :来源于javax.servlet.http.HttpServletResponse。response对象用于把取得的数据返回到客户端。
pageContext: 提供访问JSP页面的命名空间。它也提供用来访问其他的JSP隐含对象。
session :来源于javax.servlet.http.HttpSession。它用于存储客户端请求的信息,因此它是有状态交互式的。
application :来源于javax.servlet.ServletContext。
config: 来源于ServletConfig,它包含了当前JSP/Servlet所在的WEB应用的配置信息。
page :来源于当前被访问JSP页面的实例化。它实际使用的是JSP转换成的Servlet。
exception: 用于捕获JSP抛出的异常。它只有在JSP页面属性isErrorPage=true时才可用。