Java面试题

3 篇文章 0 订阅
3 篇文章 0 订阅
一、Servlet是什么?JSP是什么?它们的联系与区别是什么?
ServletJava编写的运行在Servlet容器的服务端程序,狭义的Servlet是指Servlet接口,广义的Servlet是指任何实现Servlet接口的类,我们一般理解的为后者。Servlet的作用是接收浏览器发给服务器的请求Request,经过处理后,将返回响应Response给浏览器。
JSP是一种后端脚本语言,是为了解决Html是静态的,而Servlet输出动态页面又太复杂的问题而出现的,通过JSP标签、动作、内置对象提供方便的生成动态网页功能,是一种后端渲染技术。

联系和区别:
1、JSP其实就是基于Servlet实现的,JSP生命周期
     (1)解析阶段:Servlet容器解析JSP代码,如果有错则报错;
     (2)翻译阶段:Servlet容器翻译JSP代码为Servlet源文件;
     (3)编译阶段:Servlet容器编译Servlet源代码,生成Servlet字节码类文件;
       ……剩下就是Servlet的生命周期,会在下面介绍。
2、JSP注重视图显示、Servlet注重控制,在传统的MVC架构中,JSP是View,Servlet是Controller。
3、JSP在修改静态内容时不需要重新编译。

二、Servlet API
核心包:javax.servlet与javax.servlet.http
核心类\接口:
1、javax.servlet.Servlet:Servlet核心接口,定义了init()、service()、destroy()有关Servlet 生命周期的方法。
2、javax.servlet.ServletConfig:Servlet配置接口,定义了getServletContext(),主要用于获取ServletContext实例。
3、javax.servlet.ServletContex:Servlet上下文接口,相当于Web应用的总管家。定义了getAtrribute(String name)、setAttribute(String name, Object object)、getInitParameter(String name)、getContextPath()、getRequestDispatcher(String path)等方法,主要用于应用间通信,获取web应用资源、访问服务器文件资源、输出日志等功能。
4、javax.servlet.GenericServlet:该包下唯一抽象类,实现了ServletConfig、Servlet接口,为两个接口方法提供默认的实现方式。


三、如何使用Servlet
1、继承GenericServlet类(通用)
(1)GenericServlet类有一个关键的设计,定义了一个私有的ServletConfig成员变量,在init()方法中,由Servlet容器传入ServletConfig对象与之匹配。
(2)GenericServlet类中唯一一个抽象方法是Service方法,子类必须实现Service方法,以为用户提供特定的服务。

2、继承HttpServlet类,是GenericServlet的子类,重写了Service方法,提供了HTTP的相关服务实现。用户需要做的事,根据实际情况,重写doPost()、doGet()等方法。

四、Servlet生命周期
1、初始化阶段
(1)将编译后的servlet字节码文件读入内存;
(2)Servlet容器创建ServletConfig,并与ServletContext对象建立关联关系,即调用ServletConfig的getServletContext()方法会获取到ServletContext对象。
(3)创建Servlet对象。
(4)调用GenericServlet的init(ServletConfig config)方法,建立Servlet对象与ServletConfig对象的关联。
初始化时机:
(1)未配置<load-on-startup>属性的Servlet被客户端首次访问时才会被初始化。
(2)配置<load-on-startup>属性的Servlet在web容器启动时就会按配置的数值按顺序被初始化。

2、运行时阶段,调用Servlet类的Service()方法。当Servlet将响应返回后,Servlet容器会销毁HttpServletRequest对象与HttpServletResponse对象。

3、销毁阶段,在web容器终止时,会先调用所有Servlet的destroy()方法。

五、ServletContextListener监视器
通过实现ServletContextListener接口,实现contextInitialized(ServletContextEvent sce)与contextDestroyed(ServletContextEvent sce)方法,其中可以通过参数的getServletCotext()方法获取ServletContext对象以完成监听工作。

注意:Servlet、Listener、Filter三者的加载顺序为:Listener>Filter>Servlet

六、请求转发与重定向特点以及它们的区别
1、请求转发:HttpServletRequest.getRequestDispatcher(String path).forward(request, response);
特点:
(1)服务器内部转发,浏览器URL不会改变,对用户透明。整体体现的是一个请求与一个响应。
(2)请求转发前,会清空响应缓冲区。
(3)如果转发的为Servlet或JSP(JSP也是Servlet),就会直接将当前HttpServletRequest对象与HttpServletResponse对象转交给目标Servlet或JSP的Service方法,处理后将响应结果返回给前端。
(4)如果转发的为Html静态文档,则就读取文档中数据发送到前端。
(5)请求转发不会执行转发方法之后的代码
2、重定向:HttpServletResponse.sendRedirect(String path);
特点:
(1)客户端外部转发,浏览器URL会发生改变。在Servlet调用重定向后,会返回302临时重定向状态码,响应内容为待重定向路径。然后,浏览器就会再次发出请求,请求路径为刚刚相应内容中的路径。整体体现的是两个请求与两个响应。
(2)重定向前,也会清空响应缓冲区。
(3)而重定向会执行重定向方法后的代码

区别汇总:
1、请求转发在服务端完成,重定向在客户端完成。
2、请求转发速度快,重定向速度慢。
3、请求转发是一次请求,一次响应;而重定向是两次请求,两次响应。
4、请求转发不会执行转发方法之后的代码;而重定向会执行重定向方法后的代码。
5、请求转发URL不会发生改变;而重定向URL会发生改变。
6、请求转发必须在同一台服务器下完成;而重定向可以在不同服务器下完成。

注意:请求转发与重定向的资源路径表示是有区别的
请求转发的path一般使用"/资源名",这里的 '/' 就代表了项目根路径 "http://localhost:8080/项目名/";
而重定向的path一般使用context.getContextPath() + "/资源名",不能直接使用"/资源名",因为在重定向中"/"代表了Web站点的根路径"http://localhost:8080"。

七、如何访问Servlet容器中的其他Web应用
在Service中编写如下代码:
ServletContext otherContext = context.getContext("/otherApp");
otherContext.getRequestDispatcher("/资源名").forward(request, response);

八、如何保证Servlet线程安全
1、保证变量作用域合理,线程私有的变量要定义在方法中。
2、共享变量要用保证线程安全,可以使用加锁、atomic类、volatile关键字实现。

九、JSP九大内置对象(详情可参看博客http://blog.csdn.net/zhangliangzi/article/details/49965209
1、request对象——代表javax.servlet.http.HttpServletRequest对象
2、response对象——代表javax.servlet.http.HttpServletResponse对象
3、session对象——代表javax.servlet.http.HttpSession对象
4、application对象——代表javax.servlet.ServletContext对象
5、pageContext对象——代表javax.servlet.jsp.pageContext对象
6、page对象——代表this
7、config对象——代表javax.servlet.ServletConfig对象
8、out对象——代表javax.servlet.jsp.jspWriter对象
9、exception对象——代表java.lang.Exception对象

十、Session与Cookie
为什么要使用Session与Cookie:Web应用一般使用HTTP协议传输数据,HTTP是一种无状态协议,完成数据交换后客户端与服务端的连接就会关闭。所以服务端无法根据HTTP请求区分请求者。但区分请求者身份是是非常有意义的,比如一个购物车系统,添加一件商品到购物车,服务端必须区分是哪个用户添加的商品;而且如果一段时间内某个用户多次发出请求,那么就可以对用户的相关数据进行缓存,提高访问效率。这都可以通过Session与Cookie实现。

Cookie与Session的区别在于:Cookie存在于客户端,Session存在于服务端。Cookie的存储数量是有限制的,安全性也更差。Session是基于Cookie实现的,但服务端为了获得较高的存取速度,会把Session放到内存中,在高并发环境下会增大服务器压力。

Cookie机制:
Cookie基于浏览器的支持,具有“不可跨域名性”,浏览器只能访问当前域名网站的Cookie。
Cookie的常见属性有如下几个:
String name——Cookie的名称,一旦创建便不能更改;
Object value——Cookie的值;
int maxAge——Cookie失效时间,单位为秒;
boolean secure——Cookie是否使用HTTPS或SSL的安全数据,传输前要加密,默认为false
String domain——Cookie的作用域名,比如设置为".google.com",第一个字符必须为点,代表着以google.com为结尾的域名才可以访问该Cookie。
String path——Cookie的作用项目名,比如设置为"/webApp/",最后一个字符必须为斜线,代表着contextPath为"/webApp"的程序才可以访问该Cookie。
Cookie使用:
Cookie cookie = new Cookie("name","StringValue"); // 新建Cookie
Cookie[] cookies = request.getCookie(); //获取客户端提交的所有cookie
cookie.setDomain(".leeon.top"); //设置作用域名
cookie.setPath("/testApp/"); //设置作用项目路径
cookie.setSecure(true); //设置安全属性
cookie.setMaxAge(Integer.MAX_VALUE); // 设置生命周期为永久;
response.addCookie(cookie); // 输出到客户端
在网页URL栏输入:javascript:alert (document. cookie) 可输出当前页面cookie
注意:
Coookie不能修改与删除,修改可通过创建同名Cookie后覆盖原Coolkie;删除可通过设置setMaxAge方法中的参数为0。
setMaxAge方法中的参如果设置为负值,则为存放在内存中的临时Cookie,关闭浏览器即失效;如果设置为0,则代表使Cookie失效。

Session会话机制:
Session基于Cookie的工作流程:
(1)当用户通过浏览器进程第一次请求一个支持会话的资源时,Servlet容器会为这个会话创建一个HttpSession对象,并为其分配一个唯一的ID,当前会话就此开始。
(2)把这个唯一的ID以name为JSESSIONID的Cookie形式添加到响应中,返回给客户端保存。(当Cookie被禁用时,使用URL重写机制,在URL后添加;jsessionid=XXX以传输HttpSession对象标识)
(3)当浏览器进程再次请求这个支持会话的资源时,会在请求头中加上一直保持着的JSESSIONID,Servlet容器会在HTTP请求头中自动查找这个Cookie(也可以通过HttpSession.getId()方法主动获取),如果找到,就取出对应HttpSession对象(其实用户第一次访问,也会进行相同的查询,因为查询不到,才会执行创建操作)。
Session使用:
HttpSession session = request.getSession(); //获取Session对象
session.setAtrribute("name", "StringValue");//加入session
session.getAttribute("name");//获取session
session.removeAtrribute("name");//删除session
session.setMaxInactiveInterval(int second);//设置超时时间,单位为秒,默认20分钟
session.getLastAccessedTime();//返回Session的最后活跃时间
Session持久化:
1、StandarManager是默认的Session Manager(用来管理Session)。它的实现机制是:当Tomcat服务器关闭或重启,或Web应用被重新加载时,会将内存中所有的HttpSession对象保存到文件系统中,默认的文件路径是:%CATALINA_HOME%\work\Catalina\<applicaton-name>\SESSIONS.ser
重启Tomcat后,Tomcat服务器把SESSIONS.ser中的持久化HttpSession对象加载到内存中。
2、PersistentManager能够把HttpSession对象保存到Session Store中,它提供了比较StandarManager更灵活的管理功能,具有容错能力,控制内存中HttpSession对象的数目等。
Tomcat实现Session Store的接口为org.apache.catalina.session.Store,目前提供了两个实现这一接口的类:org.apache.catalina.session.FileStore和org.apache.catalina.session.JDBCStore。FileStore会将HttpSession对象保存到文件系统中;而JDBCStore则将HttpSession对象保存到数据库表中。

十一、String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的?

答:   1、String是字符串常量,StringBuffer和StringBuilder都是字符串变量。后两者的字符内容可变,而前者创建后内容不可变。

2、String不可变是因为在JDK中String类被声明为一个final类。

3、StringBuffer是线程安全的,而StringBuilder是非线程安全的。

ps:线程安全会带来额外的系统开销,所以StringBuilder的效率比StringBuffer高。如果对系统中的线程是否安全很掌握,可用StringBuffer,在线程不安全处加上关键字Synchronize。


二、Vector,ArrayList, LinkedList的区别是什么?

答:   1、Vector、ArrayList都是以类似数组的形式存储在内存中,LinkedList则以链表的形式进行存储。

2、List中的元素有序、允许有重复的元素,Set中的元素无序、不允许有重复元素。

3、Vector线程同步,ArrayList、LinkedList线程不同步。

4、LinkedList适合指定位置插入、删除操作,不适合查找;ArrayList、Vector适合查找,不适合指定位置的插入、删除操作。

5、ArrayList在元素填满容器时会自动扩充容器大小的50%,而Vector则是100%,因此ArrayList更节省空间。

          详见:http://www.cnblogs.com/mgod/archive/2007/08/05/844011.html


三、HashTable, HashMap,TreeMap区别?

答:   1、HashTable线程同步,HashMap非线程同步。

2、HashTable不允许<键,值>有空值,HashMap允许<键,值>有空值。

3、HashTable使用Enumeration,HashMap使用Iterator。

4、HashTable中hash数组的默认大小是11,增加方式的old*2+1,HashMap中hash数组的默认大小是16,增长方式一定是2的指数倍。

5、TreeMap能够把它保存的记录根据键排序,默认是按升序排序。

详见:http://www.zlmind.com/?p=679


十四、Tomcat,Apache,JBoss的区别?

答:   1、Apache是Http服务器,Tomcat是web服务器,JBoss是应用服务器。

2、Apache解析静态的html文件;Tomcat可解析jsp动态页面、也可充当servlet容器。

详见:http://foohsinglong.iteye.com/blog/1195780


五、GET,POST区别?

答:   基础知识:Http的请求格式如下。

<request line>           主要包含三个信息:1、请求的类型(GET或POST),2、要访问的资源(如\res\img\a.jif),3、Http版本(http/1.1)

<header>                 用来说明服务器要使用的附加信息

<blank line>              这是Http的规定,必须空一行

[<request-body>]      请求的内容数据

区别:

1、Get是从服务器端获取数据,Post则是向服务器端发送数据。

2、在客户端,Get方式通过URL提交数据,在URL地址栏可以看到请求消息,该消息被编码过;Post数据则是放在Html header内提交。

3、对于Get方式,服务器端用Request.QueryString获取变量的值;对用Post方式,服务器端用Request.Form获取提交的数据值。

4、Get方式提交的数据最多1024字节,而Post则没有限制。

5、Get方式提交的参数及参数值会在地址栏显示,不安全,而Post不会,比较安全。

详见:http://www.cnblogs.com/wxf0701/archive/2008/08/17/1269798.html


七、Session, Cookie区别

答:   1、Session由应用服务器维护的一个服务器端的存储空间;Cookie是客户端的存储空间,由浏览器维护。

2、用户可以通过浏览器设置决定是否保存Cookie,而不能决定是否保存Session,因为Session是由服务器端维护的。

3、Session中保存的是对象,Cookie中保存的是字符串。

4、Session和Cookie不能跨窗口使用,每打开一个浏览器系统会赋予一个SessionID,此时的SessionID不同,若要完成跨浏览器访问数据,可以使用       Application。

5、Session、Cookie都有失效时间,过期后会自动删除,减少系统开销。

详见:http://www.chinahtml.com/1007/128010707619425.html


八、Servlet的生命周期

答:   大致分为4部:Servlet类加载-->实例化-->服务-->销毁

        下图是Tomcat中Servlet时序图。

1、Web Client向Servlet容器(Tomcat)发出Http请求。

2、Servlet容器接收Client端的请求。

3、Servlet容器创建一个HttpRequest对象,将Client的请求信息封装到这个对象中。

4、Servlet创建一个HttpResponse对象。

5、Servlet调用HttpServlet对象的service方法,把HttpRequest对象和HttpResponse对象作为参数传递给HttpServlet对象中。

6、HttpServlet调用HttpRequest对象的方法,获取Http请求,并进行相应处理。

7、处理完成HttpServlet调用HttpResponse对象的方法,返回响应数据。

8、Servlet容器把HttpServlet的响应结果传回客户端。

        其中的3个方法说明了Servlet的生命周期:

1、init():负责初始化Servlet对象。

2、service():负责响应客户端请求。

3、destroy():当Servlet对象推出时,负责释放占用资源。

详见:http://sunnylocus.iteye.com/blog/342996


九、HTTP 报文包含内容

答:   主要包含四部分:

1、request line

2、header line

3、blank line

4、request body

HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。

一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下给出了请求报文的一般格式。

(1)请求行

请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。

HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。

GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。

POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据。

(2)请求头部

请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:

User-Agent:产生请求的浏览器类型。

Accept:客户端可识别的内容类型列表。

Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

(3)空行

最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。

(4)请求数据

请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。

 

POST请求时,我读取完/r/n后,再读取一行,发现没有可以读取的内容了,那么请求数据应该怎样读取呢?

 

2010.07.20

终于弄清楚了为什么按照上面的方法读取不了请求数据,而且还跳转不到指定的地方,这是因为请求数据并不是按行存取的,即不以'/n'结束,所以因为读取不了/n而进入了死循环状态。

 只要将缓冲区的剩余部分,用printf打印出来即可。


详见:http://blog.csdn.net/heruiup/article/details/6072961


二十、Statement与PreparedStatement的区别,什么是SQL注入,如何防止SQL注入

答:   1、PreparedStatement支持动态设置参数,Statement不支持。

2、PreparedStatement可避免如类似 单引号 的编码麻烦,Statement不可以。

3、PreparedStatement支持预编译,Statement不支持。

4、在sql语句出错时PreparedStatement不易检查,而Statement则更便于查错。

5、PreparedStatement可防止Sql助于,更加安全,而Statement不行。

一、PreparedStatement的预编译机制,使其与Statement有着显著的区别


       (1)PrepareStatement语句,在经过编译器编译后,被缓存下来,下次调用相同的预编译语句时,就不需要再次编译,只要将参数直接传入编译过的语句执行代码中就能够执行。这并是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配,那么在任何时候都可以不需要再次编译而直接执行。


       (2)PreparedStatement提高了安全性


        Statement语句不安全的 简单示例:String sql = "select * from tb where name='"+appName+'"";利用appName参数值的输入,来生成恶意的sql语句,如:将[' or '1'='1']传入进来,就将句子的原意完全转变。


         PreparedStatement的预编译机制使你传入的任何内容不会和原来的语句发生任何匹配的关系,这样,你可以对传入数据的过滤省心许多。


 


二、PreparedStatement可以比较好地解决系统的本地化问题。


      譬如,在一个原始的英语系统上装好了sqlserver,那么它缺省的字符集是ANSI的Latin字符集;现在我们要将此系统作中文系统用,装好各种语言包,设置好location等等,我们期望用java写的application能够正常显示中文;但是,如果我们使用Statement往sqlserver里面插入中文得到将是编码丢失的问号等;这是因为更改设置以后,我们的字符集是gb2312,而sqlserver字符集没有变,中文串插入数据库中导致什么呢? latin字符集显然只有gb2312的一部分字符,如此导致编码丢失,无法正常显示。


 


三、谈谈PreparedStatement的缺点


   在执行SQL语句出错的时候,我们没有办法看到完整的SQL语句,甚至看不到设置的参数,这样,对调试带来的不便性。

 详见:http://blog.163.com/xiaokangzhijia@126/blog/static/1659548562010927222912/

 什么是SQL注入:

 通过sql语句的拼接达到无参数查询数据库数据目的的方法。

 如将要执行的sql语句为 select * from table where name = "+appName+",利用appName参数值的输入,来生成恶意的sql语句,如将['or'1'='1']  传入可在数据库中执行。

 因此可以采用PrepareStatement来避免Sql注入,在服务器端接收参数数据后,进行验证,此时PrepareStatement会自动检测,而Statement不  行,需要手工检测。

十一、sendRedirect, foward区别

答:   1、foward是服务器端控制页面转向,在客户端的浏览器地址中不会显示转向后的地址;sendRedirect则是完全的跳转,浏览器中会显示跳转的地址并重             新发送请求链接。

原理:forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后再将这些内容返回给浏览器,浏览器根本不知         道服务器发送的这些内容是从哪来的,所以地址栏还是原来的地址。

        redirect是服务器端根据逻辑,发送一个状态码,告诉浏览器重新去请求的那个地址,浏览器会用刚才的所有参数重新发送新的请求。

详见:http://dubaopeng.iteye.com/blog/1056564


十二、关于Java内存模型,一个对象(两个属性,四个方法)实例化100次,现在内存中的存储状态,几个对象,几个属性,几个方法。

答:   由于JAVA中new出来的对象都是放在堆中,所以如果要实例化100次,将在堆中产生100个对象,一般对象与其中的属性、方法都属于一个整体,但如果         属性和方法是静态的,就是用static关键字声明的,那么属于类的属性和方法永远只在内存中存在一份。

详见:http://wenwen.soso.com/z/q252323203.htm?sp=4000


十三、谈谈hibernate的理解,一级和二级缓存的作用,在项目中Hibernate都是怎么使用缓存的。

答:   Hibernate是一个开发的对象关系映射框架(ORM)。它对JDBC进行了非常对象封装,Hibernate允许程序员采用面向对象的方式来操作关系数据库。

Hibernate的优点:

1、程序更加面向对象

2、提高了生产率

3、方便移植

4、无入侵性。

缺点:

1、效率比JDBC略差

2、不适合批量操作

3、只能配置一种关联关系

Hibernate有四种查询方式:

1、get、load方法,根据id号查询对象。

2、Hibernate query language

3、标准查询语言

4、通过sql查询

Hibernage工作原理:

1、配置hibernate对象关系映射文件、启动服务器

2、服务器通过实例化Configuration对象,读取hibernate.cfg.xml文件的配置内容,并根据相关的需求建好表以及表之间的映射关系。

3、通过实例化的Configuration对象建立SeesionFactory实例,通过SessionFactory实例创建Session对象。

4、通过Seesion对象完成数据库的增删改查操作。

Hibernate中的状态转移

临时状态(transient)

1、不处于session缓存中

2、数据库中没有对象记录

java是如何进入临时状态的:1、通过new语句创建一个对象时。2、刚调用session的delete方法时,从seesion缓存中删除一个对象时。

持久化状态(persisted)

1、处于session缓存中

2、持久化对象数据库中没有对象记录

3、seesion在特定的时刻会保存两者同步

java如何进入持久化状态:1、seesion的save()方法。2、seesion的load().get()方法返回的对象。3、seesion的find()方法返回的list集合中存放的对象。4、Session的update().save()方法。

流离状态(detached)

1、不再位于session缓存中

2、游离对象由持久化状态转变而来,数据库中还没有相应记录。

java如何进入流离状态:1、Session的close()。Session的evict()方法,从缓存中删除一个对象。

具体如下图所示:

Hibernate中的缓存主要有Session缓存(一级缓存)和SessionFactory缓存(二级缓存,一般由第三方提供)。

详见:http://wxg6203.iteye.com/blog/766947     http://jyjiao2007.iteye.com/blog/760554


十四、反射讲一讲,主要是概念,都在哪需要反射机制,反射的性能,如何优化

答:   反射机制的定义:

是在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的功能称为java的反射机制。

反射的作用:

1、动态地创建类的实例,将类绑定到现有的对象中,或从现有的对象中获取类型。

2、应用程序需要在运行时从某个特定的程序集中载入一个特定的类

详见:http://blog.csdn.net/p785810989/article/details/6495956


十五、JAVA中的几种基本类型,各占用多少字节?


下图单位是bit,非字节 1B=8bit 


十六、String能被继承吗?为什么?

不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。平常我们定义的String str=”a”;其实和String str=new String(“a”)还是有差异的。

前者默认调用的是String.valueOf来返回String实例对象,至于调用哪个则取决于你的赋值,比如String num=1,调用的是 
public static String valueOf(int i) { 
return Integer.toString(i); 
}

后者则是调用如下部分: 
public String(String original) { 
this.value = original.value; 
this.hash = original.hash; 

最后我们的变量都存储在一个char数组中 
private final char value[];

十七、String能被继承吗?为什么?

此题考察的是类加载器实例化时进行的操作步骤(加载–>连接->初始化)。 
父类静态代变量、 
父类静态代码块、 
子类静态变量、 
子类静态代码块、 
父类非静态变量(父类实例成员变量)、 
父类构造函数、 
子类非静态变量(子类实例成员变量)、 
子类构造函数。 
测试demo:http://blog.csdn.net/u014042066/article/details/77574956 
参阅我的博客《深入理解类加载》:http://blog.csdn.net/u014042066/article/details/77394480

十八、抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么。

1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。 
2、抽象类要被子类继承,接口要被类实现。 
3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现 
4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。 
5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。 
6、抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。 
7、抽象类里可以没有抽象方法 
8、如果一个类里有抽象方法,那么这个类只能是抽象类 
9、抽象方法要被实现,所以不能是静态的,也不能是私有的。 

10、接口可继承接口,并可多继承接口,但类只能单根继承。

三十、请结合 OO 设计理念,谈谈访问修饰符 public、private、protected、default 在应用设计中的作用。

 同一个类同一个包不同包的子类不同包的非子类
private            √   
default            √                √  
protected            √                √                    √ 
public            √                √                    √                            √


public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不 
     仅可以跨类访问,而且允许跨包(package)访问。 
private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以 
     及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。 
protect: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、 
     属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。 
default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访 
     问。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值