Java 经典面试题之简答题篇(一)
1.面向对象的特征有哪些?
抽象:找出一些事物的相似和共性之处,然后将这些事物归为一类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的方面,将注意力集中到与当前主题和目标有关的方面。
封装:面向对象的封装就是把描述一个对象的属性和行为的代码封装到一个“模块”中,也就是一个类,属性用变量定义,行为用方法定义,方法可以直接访问同一个对象中的属性。封装是保证软件部件具有优良的模块性的基础,封装的目的是实现软件部件的“高内聚,低耦合”,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位,面向对象的封装比传统语言中的封装更为清晰、更为有利。
继承:在定义和实现一个类的时候,可以在一个已经存在的类的基础上进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干的新内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的关系,提高了软件的可重用性和可扩展性。
多态:多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用的到底是哪个类中实现的方法,必须在程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修饰源程序代码,就可以让引用变量绑定到不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。多态性增强了软件的灵活性和扩展性。
2.String是最基本的数据类型吗?
不是;基本数据类型包括byte、int、char、long、float、double、boolean和short。除了基本数据类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型。
3.抽象方法
1).类的声明:abstact class 类名
2).方法的声明:abstact 返回值 方法名();
3).抽象类不一定有抽象方法,但是有抽象方法的类一定是抽象类
4).如果用非抽象类继承抽象类,那么这个抽象类必须自己父类的所有方法,不然会报错
5). abstact不能与private、static、final、native并列修饰同一个方法
4.JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
相同点:
1).JSP在本质上就是Servlet.
2).JSP是Servlet技术的扩展,本质上就是Servlet的简易方式.
3).JSP编译后是“类servlet”.
不同点:
1).Servlet完全是JAVA程序代码构成,擅长于流程控制和事务处理,通过Servlet来生成动态网页很不直观.
2).JSP由HTML代码和JSP标签构成,可以方便地编写动态网页.
3).在实际应用中采用Servlet来控制业务流程,而采用JSP来生成动态网页.
4).在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层.
5).Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP是Java和HTML组合成一个扩展名为.jsp的文件.
6).JSP侧重于视图,Servlet主要用于控制逻辑.
7).JSP中嵌入JAVA代码,而Servlet中嵌入HTML代码.
5.说出连接池的工作机制
数据连接池是把数据库连接放到中间服务器上,比如tomcat上,那么相当于每次你操作数据库的时候就不需要再"连接"到数据库再进行相关操作,而是直接操作服务器上的"连接池"。
J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其标记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量由配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。
6.多线程有几种实现方式?同步有几种方式?
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
同步的实现方面有两种,分别是synchronized,wait与notify
7.描述forword和redirect的区别
一句话概括:重定向是客户端行为,转发是服务器行为
转发过程:(froward)
客户浏览器发送http请求----》web服务器接受此请求--》调用内部的一个方法在容器内部完成请求处理和转发动作----》将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客 户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
重定向过程:(Redirect)
客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器--》客户浏览器发现 是302响应,则自动再发送一个新的http请求,请求url是新的location地址----》服务器根据此请求寻找资源并发送给客户。在这里 location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
8.垃圾回收器的基本原理是什么?垃圾回收器可以马上收回内存吗?有什么办法可以主动通知虚拟机进行垃圾回收?
1).对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象,通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间
2).可以.
3).程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行.
9.EJB(Enterprise JavaBean)的优点有哪些?
1).性能优越
2).强大的容器支持
10.Servlet处理请求的方式是?
以线程的方式
11.说出Servlet的生命周期,并说出Servlet和CGI的区别
1).Servlet的生命周期:Servlet 通过调用 init () 方法进行初始化,请求到达时运行其 service() 方法处理客户端请求,当服务器决定将实例销毁的时候调用其 destroy() 方法。
2).与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。
12.访问修饰符public,private,protected,以及不写(默认)时的区别?
类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。
13.int和Integer有什么区别?
1).Integer是int的包装类,int则是java的一种基本数据类型
2).Integer变量必须实例化后才能使用,而int变量不需要
3).Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
4).Integer的默认值是null,int的默认值是0
14.请解释&和&&、|和||的区别
1).&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常;&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。
2).普通或(|)表示所有的判断条件都要执行,不管前面是否满足;短路或(||)表示如果前面的条件已经是true了,那么后面无论如何判断都是true,就不判断了
15.解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法。
堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身.
3.一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
4.由编译器自动分配释放,存放函数的参数值,局部变量的值等。
静态区/方法区;
1.方法区又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
3.全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
16.swtich 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?
在Java 5以前,switch(expr)中,expr只能是byte、short、char、int;从Java 5开始,Java中引入了枚举类型,expr也可以是enum类型,从Java 7开始,expr还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。
17.数组有没有length()方法?String有没有length()方法?
数组没有length()方法,有length 的属性。String 有length()方法。JavaScript中,获得字符串的长度是通过length属性得到的,这一点容易和Java混淆。
18.构造器(constructor)是否可被重写(override)?
构造器不能被继承,因此不能被重写,但可以被重载。
19.重载和重写的区别
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
重载(Overloading):重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。
重写(Overriding):重写的时候,父类中需要被重写的方法要求与子类中的定义某一方法有相同的方法名、参数类型和个数和返回类型,且子类函数的访问修饰权限不能少于父类。
20.是否可以继承String类?
不能;String类被final修饰,因此不能被继承。
21.String和StringBuilder、StringBuffer的区别?
Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。
1).String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。
2).StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。
3).StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是单线程,而StringBuffer是多线程的
22.描述一下JVM加载class文件的原理机制
1.装载:查找和导入class文件;
2.连接:
(1)检查:检查载入的class文件数据的正确性;
(2)准备:为类的静态变量分配存储空间;
(3)解析:将符号引用转换成直接引用(这一步是可选的)
3.初始化:初始化静态变量,静态代码块
这样的过程在程序调用类的静态成员的时候开始执行,所以静态方法main()才会成为一般程序的入口方法。类的构造器也会引发该动作。
23.抽象类(abstract class)和接口(interface)有什么异同?
抽象类是用来捕捉子类的通用特性的。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板
接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情
相同点:
1.他们都不能生成实例,都有抽象方法。
2接口是特殊的抽象类。
3.接口和抽象类的继承都使用的关键字是extends。
不同点:
1.接口的定义的变量默认是public static final型,且必须给其赋初值。所以在实现类中不能重新定义,也不能改变其值。而在抽象类中其值在子类中可以重新定义也可以重新赋值。
2.接口的方法默认的都是public abstract类型的。
3.抽象类中可以有构造器,但是接口中除了抽象方法什么都没有。
4.名字不同,接口写的是public interface Shape{}; 而抽象类写的是public abstract class Shape{}。
5.还可以从继承的角度看,接口可以多继承,一个接口可以继承多个接口。但是抽象类却不能,只能是继承一个父类,不能继承多个父类。
6.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。
7.接口里全部都是抽象方法。而抽象类里可以有抽象方法也可以有其他的方法。
24.Java 中会存在内存泄漏吗,请简单描述。
理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄露的发生。例如Hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露。
25.抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?
都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。
26.GC是什么?为什么要有GC?
GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc() 或Runtime.getRuntime().gc() ,但JVM可以屏蔽掉显示的垃圾回收调用。
27.接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?
GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc() 或Runtime.getRuntime().gc() ,但JVM可以屏蔽掉显示的垃圾回收调用。
垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。
28.一个".java"源文件中是否可以包含多个类(不是内部类)?有什么限制?
可以,但一个源文件中最多只能有一个公开类(public class)而且文件名必须和公开类的类名完全保持一致。
29.Java 中的final关键字有哪些用法?
(1)修饰类:表示该类不能被继承
(2)修饰方法:表示方法不能被重写
(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)
30.子父类加载顺序
先初始化静态成员,然后调用父类构造器,再初始化非静态成员,最后调用自身构造器。