- 一个".java"源文件中是否可以包含多个类(不是内部类)?有什么限制
- 简单说说你了解的类加载器。是否实现过类加载器
- 解释一下什么叫AOP(面向切面编程)
- 请简述 Servlet 的生命周期及其相关的方法
- 请简述一下 Ajax 的原理及实现步骤
- 简单描述Struts的主要功能
- 什么是 N 层架构
- 什么是CORBA?用途是什么
- 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”
- 什么是正则表达式?用途是什么?哪个包使用正则表达式来实现模式匹配
- 什么是懒加载(Lazy Loading)
- 什么是尾递归,为什么需要尾递归
- 什么是控制反转(Inversion of Control)与依赖注入(Dependency Injection)
21、一个.java源文件中可以包含多个类,但是只有一个public修饰的类,并且这个类名必须与文件名一致。
22、什么是类加载器?
类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。基本上所有的类加载器都是 java.lang.ClassLoader类的一个实例
类加载器可分为以下四种:
引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader。
扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。
自定义类加载器:除了系统提供的类加载器以外,开发人员可以通过继承 java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求。
为什么要使用自定义类加载器?如何自定义实现类加载器?
参考见https://www.cnblogs.com/xrq730/p/4847337.html
23、AOP面向切面编程
面向对象的特点是继承、多态和封装。而封装就要求将功能分散到不同的对象中去,在软件设计中往往称为职责分配。实际上也就是说,让不同的类设计不同的方法。这样代码就分散到一个个的类中去了。这这样做的好处是降低了代码的复杂程度,使类可重用。但是在分散代码的同时,也增加了代码的重复性。这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
面向切面编程的实现(需要动手敲代码才能理解深刻):
基于xml配置AOP编程的实现:
编写原始类,切面类,springXML配置文件,声明切点,测试
基于注解的AOP编程的实现:
编写原始类,注解切面类,xml配置文件,
使用注解的优点,不容易出错,代码量减少,解耦
http://blog.csdn.net/yunshixin/article/details/52444049
24、Servlet的生命周期:init-service-destroy
Servlet 加载--->实例化--->服务--->销毁。
init():在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()。
service():它是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。
destroy(): 仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。
25、Ajax,即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。
通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
Ajax的具体实现:get 请求 1) 创建一个XMLHttpRequest对象 2) 调用该对象的open方法 3) 如果是get请求,设置回调函数onreadystatechange = callback 4) Send
如果是post 请求 1) 创建一个XMLHttpRequest对象 2) 调用该对象的open方法 3) 调用setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”); 4) 设置回调函数onreadystatechange = callback5) Send
实现:可以使用js实现,也可以使用jquery实现
26、Struts2的功能:
从页面获得请求,处理页面请求(表单验证,类型转换,文件上传,模型驱动,设置拦截器),将请求结果传递到页面
27、N层架构,包括两方面的架构。一方面是n-tier 的物理架构,一方面是n-tier的逻辑架构。笼统的说呢,物理架构就是计算机和其他辅助硬件的架构,要分层,目的是获得高性能Performance、高扩展性Scalability、高安全性Security、和高容错性Fault tolerance;逻辑架构指的是代码设计方面的架构,代码的分层,主要的目的都是方便我们开发人员的,主要好处: 使代码更有逻辑性、 更加容易维护、 更好的代码复用、 更好的团队开发体验、更清晰的代码职责。
常见的N层架构:三层表现层,业务层,数据层
N层架构的缺点:更多层带来了额外的复杂性、额外的部署/维护的工作量和额外的成本
https://www.cnblogs.com/virusswb/archive/2009/12/15/1624962.html
http://www.cnblogs.com/zhangningawp/archive/2013/06/15/3137890.html
28、CORBA(Common Object Request Broker Architecture公共对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程序体系规范
用途:存取来自现行桌面应用程序的分布信息和资源;使现有业务数据和系统成为可供利用的网络资源; 为某一特定业务用的定制的功能和能力来增强现行桌面工具和应用程序; 改变和发展基于网络的系统以反映新的拓扑结构或新资源;
29、JVM(java虚拟机)是执行字节码文件(.class)的虚拟机进程。
因为不同的平台装有不同的JVM,它们能够将相同的.class文件,解释成不同平台所需要的机器码。正是因为有JVM的存在,java被称为平台无关的编程语言
30、正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
用途:模式匹配、搜索、切割、替换、验证
Java1.4起,Java核心API就引入了java.util.regex程序包,它包括两个类:Pattern和Matcher.
Pattern是对正则表达式进行编译,得到正则表达式的表现模式。Matcher利用Pattern得到的表现模式进行模式匹配。
31、懒加载就是什么时候使用什么时候开辟空间,不用的时候只是一个指针不占用内存,当使用的时候为其alloc/init,这时候才占用内存.只要不使用就永远不会真正生成,不会占用空间.能够减少内存的占用,效率高。其本质是重写get方法。
背景:由于内存有限,如果我们一次性将所有资源加载完毕将极大的消耗内存,降低程序运行效率。所以就要将一些比较大的资源,如音频,数据,图片等大资源进行懒加载,就需要先判断是否存在,如果不存在再创建实例化。
32、尾递归是指所有递归形式的调用,一定是发生在函数的末尾。形式上只要最后一个return语句是单纯函数就可以。如:return tailrec(x+1);
而return tailrec(x+1) + x;或者return x*tailrec(x+1);都不可以。因为无法更新tailrec()函数内的实际变量,只是新建一个栈。
尾递归和一般的递归不同在对内存的占用,普通递归创建stack累积而后计算收缩,尾递归只会占用恒量的内存(和迭代一样)。处理运算很大,普通递归可能导致栈溢出,而尾递归则不会。
尾递归的实例:fibonacci数列,求最大公约数,阶乘,反转字符串,验证字符串是否回文,反转整数。
33、Spring三大核心思想,IOC反转控制,DI依赖注入,AOP面向切面编程。
IOC,控制反转是一种编程思想,是你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
DI,依赖注入:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。
AOP,面向切面编程,在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。