Java面试笔试题大汇总七.docx
《Java面试笔试题大汇总七.docx》由会员分享,可在线阅读,更多相关《Java面试笔试题大汇总七.docx(22页珍藏版)》请在冰豆网上搜索。
Java面试笔试题大汇总七
Java面试笔试题大汇总(七)
149、JAVA代码查错
(1)下面这段代码有什么错误?
abstractclassName{
privateStringname;
publicabstractbooleanisStupidName(Stringname){}
}
答:
abstractmethod必须以分号结尾,且不带花括号。
(2)下面这段代码有错吗?
publicclassSomething{
voiddoSomething(){
privateStrings="";
intl=s.length();
}
}
答:
有错。
局部变量前不能放置任何访问修饰符(private,public,和protected)。
final可以用来修饰局部变量
(final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和method而非variable)。
(3)下面这段代码有错吗?
abstractclassSomething{
privateabstractStringdoSomething();
}
答:
错。
abstract的methods不能以private修饰。
abstract的methods就是让子类implement(实现)具体细节的,怎么可以用private把abstractmethod封锁起来呢?
(同理,abstractmethod前不能加final)。
(4)下面这段代码有什么错误?
publicclassSomething{
publicintaddOne(finalintx){
return++x;
}
}
答:
这个错误比较明显。
intx被修饰成final,意味着x不能在addOnemethod中被修改。
(5)下面这段代码有错吗?
publicclassSomething{
publicstaticvoidmain(String[]args){
Othero=newOther();
newSomething().addOne(o);
}
publicvoidaddOne(finalOthero){
o.i++;
}
}
classOther{
publicinti;
}
答案:
正确。
在addOnemethod中,参数o被修饰成final。
如果在addOnemethod里我们修改了o的reference
(比如:
o=newOther();),那么如同上例这题也是错的。
但这里修改的是o的membervairable
(成员变量),而o的reference并没有改变。
(6)下面这段代码有错吗?
classSomething{
inti;
publicvoiddoSomething(){
System.out.println("i="+i);
}
}
答案:
正确。
输出的是"i=0"。
inti属於instantvariable(实例变量,或叫成员变量)。
instantvariable有defaultvalue。
int的defaultvalue是0。
(7)和上面一题只有一个地方不同,就是多了一个final。
下面这段代码有错吗?
classSomething{
finalinti;
publicvoiddoSomething(){
System.out.println("i="+i);
}
}
答案:
错。
finalinti是个final的instantvariable(实例变量,或叫成员变量)。
final的instantvariable没有defaultvalue,必须在constructor(构造器)结束之前被赋予一个明确的值。
可以修改为"finalinti=0;"。
(8)下面这段代码看上去很完美,错在哪里呢?
publicclassSomething{
publicstaticvoidmain(String[]args){
Somethings=newSomething();
System.out.println("s.doSomething()returns"+doSomething());
}
publicStringdoSomething(){
return"Dosomething...";
}
}
答案:
错。
看上去在main里calldoSomething没有什么问题,毕竟两个methods都在同一个class里。
但仔细看,main是static的。
staticmethod不能直接callnon-staticmethods。
可改成"System.out.println("s.doSomething()returns"+s.doSomething());"。
同理,staticmethod不能访问non-staticinstantvariable。
(9)此处Something类的文件名叫OtherThing.java
classSomething{
privatestaticvoidmain(String[]something_to_do){
System.out.println("Dosomething...");
}
}
答案:
从没有人说过Java的Class名字必须和其文件名相同。
但publicclass的名字必须和文件名相同,错误,main一定是public的。
(10)下面这段代码有错吗?
interfaceA{
intx=0;
}
classB{
intx=1;
}
classCextendsBimplementsA{
publicvoidpX(){
System.out.println(x);
}
publicstaticvoidmain(String[]args){
newC().pX();
}
}
答案:
错误。
在编译时会发生错误(错误描述不同的JVM有不同的信息,意思就是未明确的x调用,两个x都匹配(就象在同时importjava.util和java.sql两个包时直接声明Date一样)。
对于父类的变量,可以用super.x来明确,而接口的属性默认隐含为publicstaticfinal.所以可以通过A.x来明确。
(11)这个错误不容易发现
interfacePlayable{
voidplay();
}
interfaceBounceable{
voidplay();
}
interfaceRollableextendsPlayable,Bounceable{
Ballball=newBall("PingPang");
}
classBallimplementsRollable{
privateStringname;
publicStringgetName(){
returnname;
}
publicBall(Stringname){
this.name=name;
}
publicvoidplay(){
ball=newBall("Football");
System.out.println(ball.getName());
}
}
答案:
错。
"interfaceRollableextendsPlayable,Bounceable"没有问题。
interface可继承多个interfaces,所以这里没错。
问题出在interfaceRollable里的"Ballball=newBall("PingPang");"。
任何在interface里声明的interfacevariable(接口变量,也可称成员变量),默认为publicstaticfinal。
也就是说"Ballball=newBall("PingPang");"实际上是"publicstaticfinalBallball=newBall("PingPang");"。
在Ball类的Play()方法中,"ball=newBall("Football");"改变了ball的reference,而这里的ball来自Rollableinterface,Rollableinterface里的ball是publicstaticfinal的,final的object是不能被改变reference的。
因此编译器将在"ball=newBall("Football");"这里显示有错。
150、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。
写出程序。
以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。
publicclassThreadTest1{
privateintj;
publicstaticvoidmain(Stringargs[]){
ThreadTest1tt=newThreadTest1();
Incinc=tt.newInc();
Decdec=tt.newDec();
for(inti=0;i<2;i++){
Threadt=newThread(inc);
t.start();
t=newThread(dec);
t.start();
}
}
privatesynchronizedvoidinc(){
j++;
System.out.println(Thread.currentThread().getName()+"-inc:
"+j);
}
privatesynchronizedvoiddec(){
j--;
System.out.println(Thread.currentThread().getName()+"-dec:
"+j);
}
classIncimplementsRunnable{
publicvoidrun(){
for(inti=0;i<100;i++){
inc();
}
}
}
classDecimplementsRunnable{
publicvoidrun(){
for(inti=0;i<100;i++){
dec();
}
}
}
}
6、线程的基本概念、线程的本状态以及状态之间的关系
?
新建(Born):
新建的线程处于新建状态?
就绪(Ready):
在创建线程后,它将处于就绪状态,等待start()方法被调用?
运行(Running):
线程在开始执行时进入运行状态?
睡眠(Sleeping):
线程的执行可通过使用sleep()方法来暂时中止。
在睡眠后,线程将进入就绪状态?
等待(Waiting):
如果调用了wait()方法,线程将处于等待状态。
用于在两个或多个线程并发运行时。
?
挂起(Suspended):
在临时停止或中断线程的执行时,线程就处于挂起状态。
?
恢复(Resume):
在挂起的线程被恢复执行时,可以说它已被恢复。
?
阻塞(Blocked)–在线程等待一个事件时(例如输入/输出操作),就称其处于阻塞状态。
?
死亡(Dead)–在run()方法已完成执行或其stop()方法被调用之后,线程就处于死亡状态。
5、串行化的注意事项以及如何实现串行化答:
如果有循环引用是不可以串行化的。
对象输出流的WriteObject方法和对象输入流的ReadObect方法
7、线程的同步、如何实现线程的同步答:
当两个或多个线程同时访问同一个变量,并且以个线程需要修改这个变量。
就要用到线程同步。
在Java中,同步是通过synchronized关键字来定义的。
诺是想同步化某程序段,可以使用synchronized(object){}方法,其中{}内的程序语句被同步化。
9、socket通信(tcp/udp区别及JAVA的实现方式)TCP——传输控制协议,具有极高的可靠性,保证数据包按照顺序准确到达,但其也有着很高的额外负担。
UDP——使用者数据元协议,并不能保证数据包会被成功的送达,也不保证数据包到达的顺序,但其传输速度很快。
大多数我们会使用TCP,偶尔才会动用UDP,如声音讯号,即使少量遗失,也无 关紧要。
10、JAVA的事件委托机制和垃圾回收机制
java事件委托机制的概念,一个源产生一个事件并将它送到一个或多个监听器那里。
在这种方案中,监听器简单的等待,直到它收到一个事件。
一旦事件被接受,监听器将处理这个事件,然后返回。
垃圾回收机制垃圾收集是将分配给对象但不在使用的内存回收或释放的过程。
如果一个对象没有指向它的引用或者其赋值为null,则次对象适合进行垃圾回收
11、JDBC调用数据库的基本步骤导入必要的类,装入JDBC驱动程序,识别数据源,分配一个Connection对象,分配一个Statement对象,使用Statement执行一个查询,从返回的ResultSet对象中检索数据,关闭ResultSet,关闭Statement对象,关闭Connection对象
12、解析XML文件的几种方式和区别答:
Dom解析在内存中创建一个DOM树,能随机访问文件内容,也可以修改原文件内容SAX解析线性解析,不能随机访问,也无法修改原文件Dom解析要先用SAX解析创建DOM树
13、JAVA的四种基本权限的定义publicprivateprotected默认
14、JAVA的国际化 答:
Java中提供了诺干国际化明感类,来实现国际化的。
例如:
dateformat timezone等等。
5、servlet的配置
Adminjb-aptech.adminservletemailadmin@jb-
16、谈谈你对swingmvc模式的理解?
答:
Swing号称是完全按照MVC的思路来进行设计的。
在设计开始前,Swing的希望能够达到的目标就包括:
模型驱动(Model-Driven)的编程方式。
提供一套单一的API,但是能够支持多种视感(look-and-feel),为用户提供不同的界面。
严格的说,Swing中的MVC实际上是MVC的一个变体:
M-VC。
Swing中只显示的定义了Model接口,而在一个UI对象中集成了视图和控制器的部分机制。
View和Control比较松散的交叉组合在一起,而更多的控制逻辑是在事件监听者部分引入的。
但是,这并没有妨碍在Swing中体现MVC的精髓。
事实上,在Swing的开发初期,Swing确实是按照标准的MVC模式来设计的,但是很快的问题就出现了:
View和Controller实际上是紧密耦合的,很难作出一个能够适应不同View的一般化的Controller来,而且,一般也没有很大的必要。
18、Java程序怎么优化?
答:
提高JAVA的性能,一般考虑如下的四个主要方面:
程序设计的方法和模式
(2)JAVA布署的环境。
(3)JAVA应用程序的实现(4)硬件和操作系统为了提高JAVA程序的性能,需要遵循如下的六个步骤。
a)明确对性能的具体要求b)了解当前程序的性能c)找到程序的性能瓶颈 d)采取适当的措施来提高性能e)只进行某一方面的修改来提高性能f)返回到步骤c,继续作类似的工作,一直达到要求的性能为止。
动态查询如何实现?
表的结构变化后,如果不需要修改程序,如何设计和实现查询?
答:
讲查询封装进存储过程中,通过调用存储过程实现动态调用;表结构发生变化后修改相应的存储过程即可再不修改程序的情况下实现查询。
2、如何优化数据库,如何提高数据库的性能?
答:
优化数据库主要是优化查询语句,通过高性能的查询语句提高数据库的性能。
3、设计数据库应注意那些问题答:
首先应尽量满足三范式的要求,在一定程度上打破3范式的要求以提高数据库的性能。
4、表与表之间的关联关系答:
分为3种:
一对一、一对多、多对多。
5、主键和外键的区别答:
主键在本表中是唯一的、不可唯空的,外键可以重复可以唯空;外键和另一张表的主键关联,不能创建对应表中不存在的外键。
3.数据类型之间的转换 如何将数值型字符转换为数字(Integer,Double) 如何将数字转换为字符 如何去小数点前两位,并四舍五入。
4.日期和时间 如何取得年月日,小时分秒Datedat=newDate();dat.getYear();dat.getMonth();dat.getDay();dat.getHours();...
如何取得从1970年到现在的毫秒数longnow=dat.getTime();如何获取某个日期是当月的最后一天如何格式化日期
DateFormatedf=DateFormate.getInstance();df.Format(dat);
6.文件和目录(I/O)操作 如何列出某个目录下的所有文件 如何列出某个目录下的所有子目录 判断一个文件或目录是否存在 如何读写文件
6.文件和目录(I/O)操作 如何列出某个目录下的所有文件 如何列出某个目录下的所有子目录 判断一个文件或目录是否存在 如何读写文件
4.描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理。
Cookie是在客户端开辟的一块可长期存储用户信息的地方;
8.描述一下你最常用的编程风格。
(1)类名首字母应该大写。
字段、方法以及对象(句柄)的首字母应小写。
对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母。
Java包(Package)属于一种特殊情况:
它们全都是小写字母,即便中间的单词亦是如此。
对于域名扩展名称,如com,org,net或者edu等,全部都应小写(这也是Java1.1和Java1.2的区别之一)。
(2)为了常规用途而创建一个类时,请采取“经典形式”,并包含对下述元素的定义:
equals()hashCode()toString()clone()(implementCloneable)implementSerializable
(3)对于自己创建的每一个类,都考虑置入一个main(),其中包含了用于测试那个类的代码。
为使用一个项目中的类,我们没必要删除测试代码。
若进行了任何形式的改动,可方便地返回测试。
这些代码也可作为如何使用类的一个示例使用。
(4)应将方法设计成简要的、功能性单元,用它描述和实现一个不连续的类接口部分。
理想情况下,方法应简明扼要。
若长度很大,可考虑通过某种方式将其分割成较短的几个方法。
这样做也便于类内代码的重复使用(有些时候,方法必须非常大,但它们仍应只做同样的一件事情)。
(5)设计一个类时,请设身处地为客户程序员考虑一下(类的使用方法应该是非常明确的)。
然后,再设身处地为管理代码的人考虑一下(预计有可能进行哪些形式的修改,想想用什么方法可把它们变得更简单)。
(6)使类尽可能短小精悍,而且只解决一个特定的问题。
下面是对类设计的一些建议:
一个复杂的开关语句:
考虑采用“多形”机制数量众多的方法涉及到类型差别极大的操作:
考虑用几个类来分别实现许多成员变量在特征上有很大的差别:
考虑使用几个类
(7)让一切东西都尽可能地“私有”——private。
可使库的某一部分“公共化”(一个方法、类或者一个字段等等),就永远不能把它拿出。
若强行拿出,就可能破坏其他人现有的代码,使他们不得不重新编写和设计。
若只公布自己必须公布的,就可放心大胆地改变其他任何东西。
在多线程环境中,隐私是特别重要的一个因素——只有private字段才能在非同步使用的情况下受到保护。
(8)谨惕“巨大对象综合症”。
对一些习惯于顺序编程思维、且初涉OOP领域的新手,往往喜欢先写一个顺序执行的程序,再把它嵌入一个或两个巨大的对象里。
根据编程原理,对象表达的应该是应用程序的概念,而非应用程序本身。
(9)若不得已进行一些不太雅观的编程,至少应该把那些代码置于一个类的内部。
(10)任何时候只要发现类与类之间结合得非常紧密,就需要考虑是否采用内部类,从而改善编码及维护工作(参见第14章14.1.2小节的“用内部类改进代码”)。
(11)尽可能细致地加上注释,并用javadoc注释文档语法生成自己的程序文档。
(12)避免使用“魔术数字”,这些数字很难与代码很好地配合。
如以后需要修改它,无疑会成为一场噩梦,因为根本不知道“100”到底是指“数组大小”还是“其他全然不同的东西”。
所以,我们应创建一个常数,并为其使用具有说服力的描述性名称,并在整个程序中都采用常数标识符。
这样可使程序更易理解以及更易维护。
(13)涉及构建器和异常的时候,通常希望重新丢弃在构建器中捕获的任何异常——如果它造成了那个对象的创建失败。
这样一来,调用者就不会以为那个对象已正确地创建,从而盲目地继续。
(14)当客户程序员用完对象以后,若你的类要求进行任何清除工作,可考虑将清除代码置于一个良好定义的方法里,采用类似于cleanup()这样的名字,明确表明自己的用途。
除此以外,可在类内放置一个boolean(布尔)标记,指出对象是否已被清除。
在类的finalize()方法里,请确定对象已被清除,并已丢弃了从RuntimeException继承的一个类(如果还没有的话),从而指出一个编程错误。
在采取象这样的方案之前,请确定finalize()能够在自己的系统中工作(可能需要调用System.runFinalizersOnExit(true),从而确保这一行为)。
(15)在一个特定的作用域内,若一个对象必须清除(非由垃圾收集机制处理),请采用下述方法:
初始化对象;若成功,则立即进入一个含有finally从句的try块,开始清除工作。
(16)若在初始化过程中需要覆盖(取消)finalize(),请记住调用super.finalize()(若Object属于我们的直接超类,则无此必要)。
在对finalize()进行覆盖的过程