JAVA面试题.docx
《JAVA面试题.docx》由会员分享,可在线阅读,更多相关《JAVA面试题.docx(22页珍藏版)》请在冰豆网上搜索。
![JAVA面试题.docx](https://file1.bdocx.com/fileroot1/2022-11/28/0ee640a0-ad7f-46d5-bfcc-429f9e7ad654/0ee640a0-ad7f-46d5-bfcc-429f9e7ad6541.gif)
JAVA面试题
诚信、创新、开放、合作
1.在main(String[]args)方法内是否可以调用一个非静态方法?
答案:
不能
2.同一个文件里是否可以有两个public类?
答案:
不能
3.方法名是否可以与构造器的名字相同?
答案:
可以。
publicclassTest
{
publicTest(Stringiceboy)
{
System.out.println(iceboy);
}
publicvoidTest(Stringiceboy)
{
System.out.println(iceboy);
}
publicstaticvoidmain(String[]args)
{
Testa=newTest("abc");//输出“abc”
a.Test("iceboy");//输出“iceboy”
}
}
4.初始化了一个没有run()方法的线程类,是否会出错?
答案:
不会。
第一种方法:
直接继承Thread类。
publicclassTest
{
publicstaticvoidmain(String[]args)
{
ThreadClasst=newThreadClass();
t.start();
System.out.println("end");//输出“end”
}
}
classThreadClassextendsThread//Thread类已经实现了空的run()方法。
{
}
第二种方法:
实现Runnable接口
publicclassTest
{
publicstaticvoidmain(String[]args)
{
ThreadClasst=newThreadClass();
Threadthread=newThread(t);
thread.start();
System.out.println("end");
}
}
classThreadClassimplementsRunnable
{
publicvoidrun()//必须有此方法否则编译报错。
它是Runnable接口中的抽象方法。
{
System.out.println("Threads");
}
}
4.局部内部类是否可以访问非final变量?
答案:
不能访问局部的,可以访问成员变量(全局的)。
classOut
{
privateStringname="out.name";
voidprint()
{
finalStringwork="out.local.work";//若不是final的则不能被Animal使用.
intage=10;
classAnimal
//定义一个局部内部类.只能在print()方法中使用.
//局部类中不能使用外部的非final的局部变量.全局的可以.
{
publicvoideat()
{
System.out.println(work);//ok
//age=20;errornotfinal
System.out.println(name);//ok.
}
}
Animallocal=newAnimal();
local.eat();
}
}
5.选择语句case中,允许使用的值有哪些?
答案:
int,short,char,byte(都在int范围之内,且是整数)
6.Math,String是不可继承的。
(final类)
Instanceof后面跟的应该是OBJECT。
构造器可以是私有的。
(private)
=与==意义是完全不同的。
一个是赋值,一个是等于。
全局变量可以不进行初始化,如果使用一个局部变量,则这个局部变量要被初始化。
7.在try-catch-final块中的退出语句。
publicclassTest
{
publicstaticvoidmain(String[]args)
{
inta=1;
try
{
a=a/0;
}catch(Exceptione)
{
System.out.println("catch");
return;//当return时,finally中的语句会执行。
//System.exit(0);//若用上这句,finally中的语句不会执行。
直接返回,退出程序。
}
finally//当没有System.exit(0);时,无论是否发生异常它都会执行。
{
System.out.println("finally");
}
}
}
注:
try-catch-final块的顺序不能调换。
8.下面都是正确的main方法签名。
publicstaticvoidmain(String[]args)
publicstaticfinalvoidmain(String[]args)
staticpublicvoidmain(String[]args)
staticpublicsynchronizedvoidmain(String[]args)
staticpublicabstractvoidmain(String[]args)//错误
9.if(-0.0==0.0)是相等还是不等?
答案:
相等。
10.一个抽象类是否可以没有抽象方法?
答案:
可以。
11.RandomAccessFile类继承Object,并且实现了DataInput和DataOutput接口。
答案:
正确
12.Collection与Collections的区别?
答案:
Collection是一个接口,但Collections却是一个辅助类,里面有很多静态的工具方法。
而且很有用的。
如:
reverse(List list);sort(List list,Comparator c)等。
Collections没有实现任何接口。
它直接继承了Object。
13.classChildextendsParents{}
classParents{}
是否可以这样声明类,在一个文件中?
答案:
可以。
无所谓的。
14.数组,无论是当前的,还是类等级的,都会被初始化。
String是被初始化为null,不是空字符。
null,““,”“,都是不同的。
“continue”只能在一个循环里(如for,do,while),它不能在case语句中出现。
Primitive(int,char,long等)数组是不能互相赋值的,即使它们本身可以。
一个Constructor可以抛出任何异常。
初始化块是按照声明的顺序执行的。
所有关于NaN(NotaNumber)和non-NaN的比较,都返回false. 这条很重要。
==会产生编译错误,如果两边类型不匹配的话。
equals()返回false如果对象类型不同,但不产生编译错误。
15.Java成员变量默认初始化的值。
成员变量类型 取值
byte-0short-0int-0 long-0L
char-'\u0000'float-0.0Fdouble-0.0Dboolean-false
所有引用类型 null
16. integer和long操作/和%的话,可能会抛出ArithmeticException,比如除0。
但是float与
double不会,即使是除以0。
doublea=0;a=a/0;则a等于NaN。
17.普通内部类不可以拥有静态变量,但静态内部类可以。
File类没有任何处理文件内容的方法。
InputStream和OutputStream是抽象类,DataInput和DataOutput是接口。
DataInputStream实现了DataInput接口。
18.面向对象的特征有哪些方面?
答案:
最基本特征:
封装,继承,多态。
其他特征:
抽象关联,聚合,组合,内聚,耦合
19.String是最基本的数据类型吗?
String和StringBuffer的区别?
答案:
String不是一最基本的数据类型。
STRING的长度是不可变的,STRINGBUFFER的长度是可变的。
如果你对字符串中的内容经常
进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法
20.int和Integer有什么区别
答案:
int是基本类型。
Integer是引用类型。
Integer可以把String转换成int。
21.运行时异常与一般异常有何异同?
答案:
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。
java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
22.说出一些常用的类,包,接口,请各举5个?
答案:
常用类-System,ArrayList,FileInputStream,Thread,Socket.
常用的包-java.io,java.util,java.sql,java.javax.naming,
常用接口-Collection,Connection,Cloneable,Comparable,Serializable
23.说出ArrayList,Vector,LinkedList的存储性能和特性.
答案:
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
24.设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。
写出程序。
注:
因为这4个线程共享J,所以线程类要写到内部类中。
加线程:
每次对j加一。
减线程:
每次对j减一。
publicclassTestThreads
{
privateintj=1;
//加线程
privateclassIncimplementsRunnable
{
publicvoidrun()
{
for(inti=0;i<10;i++)
{
inc();
}
}
}
//减线程
privateclassDecimplementsRunnable
{
publicvoidrun()
{
for(inti=0;i<10;i++)
{
dec();
}
}
}
//加1
privatesynchronizedvoidinc()
{
j++;
System.out.println(Thread.currentThread().getName()+"-inc:
"+j);
}
//减1
privatesynchronizedvoiddec()
{
j--;
System.out.println(Thread.currentThread().getName()+"-dec:
"+j);
}
//测试程序
publicstaticvoidmain(String[]args)
{
TestThreadstest=newTestThreads();
//创建两个线程类
Threadthread=null;
Incinc=test.newInc();
Decdec=test.newDec();
//启动4个线程
for(inti=0;i<2;i++)
{
thread=newThread(inc);
thread.start();
thread=newThread(dec);
thread.start();
}
}
}
25.数组转换问题。
Object[]object=newPerson[2];
Person[]person=newPerson[3];
person=(Person[])object;//可以转换
int[]i=newint[2];
long[]l=newint[3];
i=(long[])l;//不可以转换
26.用socket通讯写出客户端和服务器端的通讯,要求客户发送数据后能够回显相同的数据。
Server.java:
源代码
import.*;
importjava.io.*;
classServer
{
publicServer()
{
BufferedReaderbr=null;
PrintWriterpw=null;
try
{
ServerSocketserver=newServerSocket(8888);//建立服务器端
Socketsocket=server.accept();//监听客户端
//得到该连接的输入流
br=newBufferedReader(newInputStreamReader(socket.getInputStream()));
//得到该连接的输出流
pw=newPrintWriter(socket.getOutputStream(),true);
//先读后写
Stringdata=br.readLine();
System.out.println(data);//输出到控制台
pw.println(data);//转发给客户端
}catch(Exceptione)
{
e.printStackTrace();
}
finally
{
try
{
//关闭读写流
br.close();
pw.close();
}catch(Exceptione)
{}
}
}
publicstaticvoidmain(String[]args)
{
Serverserver=newServer();
}
}
Client.java:
源代码
import.*;
importjava.io.*;
classClient
{
publicClient()
{
BufferedReaderbr=null;
PrintWriterpw=null;
try
{
Socketsocket=newSocket("localhost",8888);//与服务器建立连接,服务器要先启
//得到Socket的输入与输出流
br=newBufferedReader(newInputStreamReader(socket.getInputStream()));
pw=newPrintWriter(socket.getOutputStream(),true);
//先写后读
pw.println("Client:
你好!
");
Stringdata=null;
while(true)
{
data=br.readLine();
if(data!
=null)break;
}
System.out.println(data);
}catch(Exceptione)
{
e.printStackTrace();
}
finally
{
try
{
br.close();
pw.close();
}catch(Exceptione)
{}
}
}
publicstaticvoidmain(String[]args)
{
Clientc=newClient();
}
}
27.谈谈final,finally,finalize的区别。
答案:
final用于声明属性,方法和类,分别表示属性不可变,注意:
如果是基本类型说明变
量本身不能改变,如果是引用类型,说明它不能指向其他的对象了。
但对象还是可以改变
的。
方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示无论是否出现异常总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
28.AnonymousInnerClass(匿名内部类)是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
答案:
可以继承其他类或完成其他接口,在swing编程中常用此方式。
29.StaticNestedClass和InnerClass的不同,说得越多越好(面试题有的很笼统)。
答案:
StaticNestedClass是被声明为静态(static)的内部类,它可以不依赖于外部类实例
被实例化。
而通常的内部类需要在外部类实例化后才能实例化。
30.&和&&的区别。
答案:
&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and).
另外,&也可以用于逻辑运算,与&&的区别在于&是非短路运算符,&&是短路运算符
31.HashMap和Hashtable的区别。
答案:
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都实现了Map接口,
主要区别在于HashMap允许空(null)键值(key)与空值(value),由于非线程安全,效率上可能高于Hashtable,Hashtable不允许有空(null)键值(key)与空值(value)。
32.什么时候用assert?
答案:
1.4新增关键字(语法),用于测试boolean表达式状态,可用于调试程序。
使用方法assert,表示如果表达式为真(true),则下面的语句执行,否则抛出AssertionError。
33.GC是什么?
为什么要有GC?
答案:
GC是垃圾收集的意思(GabageCollection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显式操作方法。
34.Strings=newString("xyz");创建了几个StringObject?
答案:
两个,一个是对象,一个是对象的引用。
35.Math.round(11.5)等於多少?
Math.round(-11.5)等於多少?
答案:
Math.round(11.5)==12
Math.round(-11.5)==-11,总是返回接近0的数。
36.shorts1=1;s1=s1+1;有什么错?
shorts1=1;s1+=1;有什么错?
答案:
shorts1=1;s1=s1+1;有错(s1+1运算结果是int型,需要强制转换类型)
shorts1=1;s1+=1;(没有错,s1==2)
37.sleep()和wait()有什么区别?
答案:
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间(休息),把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复,时间到了会继续运行。
调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
38.Java有没有goto语句?
答案:
没有
39.数组有没有length()这个方法?
String有没有length()这个方法?
答案:
数组没有length()这个方法,有length的属性。
String有length()这个方法。
40.数组是不是基本类型?
答案:
不是。
41.Overload和Override的区别。
Overloaded的方法是否可以改变返回值的类型?
答案:
方法的重写Overriding和重载Overloading是Java多态性的不同表现。
重载Overload是一个类中多态性的一种表现,方法名必需相同,参数列表必需不同.(长度不同或类型不同),与返回值类型没有关系.构造器也可以重载.方法名和参数列表都相同,只有返回类型不相同则是方法重复定义.编译出错.Overloaded的方法是可以改变返回值的类型。
重写Override是父类与子类之间多态性的一种表现。
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。
子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。
42.Set里的元素能重复吗?
那么用什么方法区分是否重复?
答案:
Set里的元素是不能重复的,如果重复就重复的就不加到里面。
用iterator()方法来区分
重复与否。
应该覆盖equals()判断两个Set是否相等。
43.”==”与equal有何区别?
答案:
“==”比较的是内存地址,equal比较的是内容本身。
44.给我一个你最常见到的runtimeexception。
答案:
IndexOutOfBoundsException数组越界
NullPointerException空指针异常
SystemExcep