Java 常见面试基础题

1.  类和对象的区别?    [易]   

      类是对象的抽象,是模型概念,而对象是实实在在存在的事物,是现实中存在的实体  

2.  Java类库中八个标准包分别是什么?  [易]   
        java.lang    提供常用的类、接口、一般异常、系统等编程语言的核心内容。    
        java.util    包含日期、日历、向量、堆栈等实用工具。    
        java.io      包含输入输出流类、文件类等与输入输出I/O有关的类。        
        java.awt     包含窗口和屏幕元素类,事件处理接口等与图形用户界面有关的内容。       
        java.applet  提供为编写applet小程序所需要的类。    
        java.text    提供与文本有关的类。    
        java.net     包含url类等与网络传输有关的东西。        

        java.sql     提供与数据库应用相关的类和接口。  

3.  接口和抽象类有什么区别?    [中]   
                接口是公开的,不能包含私有的方法或变量;而抽象类是可以有私有方法或私有变量的,    
        实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,   
        接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,   
        接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.   

        一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。

4.  说说java中的内存分配?  [难]   
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存   
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。    
  
堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。    
  

引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因。但是在写程序的时候,可以人为的控制   

5.  Character类有哪些常用方法?  [难]   
charValue()    
返回字符对象对应的值。    
digit(char, int)    
以指定基数返回字符 ch 对应的数值。    
equals(Object)    
比较该对象和指定对象。    
forDigit(int, int)    
确定以指定基数指定的数对应的字符。    
getNumericValue(char)    
返回此字符对应的 Unicode 的非负整型值。    
getType(char)    
返回一个表示字符种类的值。    
hashCode()    
返回此字符对应的哈希码。    
isDefined(char)    
判定一个字符在 Unicode 中是否有定义。    
isDigit(char)    
判定指定字符是否为数字。    
isIdentifierIgnorable(char)    
判定指定字符在 Java 标识符中或 Unicode 标识符中是否应看作是一个可忽略字符。    
isISOControl(char)    
判定指定字符是否为 ISO 控制字符。    
isJavaIdentifierPart(char)    
判定指定字符是否为 Java 标识符中除首字符外的字符。    
isJavaIdentifierStart(char)    
判定指定字符是否可作为 Java 标识符的首字符。    
isJavaLetter(char)    
判定指定字符是否为 Java 字母,若是,它可作为 Java 语言中一个标识符的首字符。 不推荐使用该方法。    
isJavaLetterOrDigit(char)    
判定指定字符是否为 Java 字母或数字,若是,它可作为 Java 语言中的一个标识符除首字符外的字符。 不推荐使用该方法。    
isLetter(char)    
判定指定字符是否为字母。    
isLetterOrDigit(char)    
判定指定字符是否为字母或数字。    
isLowerCase(char)    
判定指定字符是否为小写字符。    
isSpace(char)    
判定指定字符是否为 ISO-LATIN-1 空格。 不推荐使用该方法。    
isSpaceChar(char)    
判定指定字符是否为 Unicode 空白字符。    
isTitleCase(char)    
判定指定字符是否为标题字符。    
isUnicodeIdentifierPart(char)    
判定指定字符是否为 Unicode 标识符中除首字符外的字符。    
isUnicodeIdentifierStart(char)    
判定指定字符是否可作为 Unicode 标识符首字符。    
isUpperCase(char)    
判定指定字符是否为大写字符。    
isWhitespace(char)    
据 Java 语言,判定指定字符是否为空格。    
toLowerCase(char)    
将给定字符映射为对应的小写字符,若没有对应的小写字符,返回此字符本身。    
toString()    
返回表示此字符值的串对象。    
toTitleCase(char)    
将字符参数转换为标题字符。    
toUpperCase(char)    
将字符参数转换为大写字符。    
5.Boolean类有哪些方法?   
booleanValue()    
返回 Boolean 对象对应的布尔值。    
equals(Object)    
当且仅当参数非空,且是包含与此对象相同的布尔值的布尔对象时,返回 true。    
getBoolean(String)    
当且仅当以参数命名的系统属性存在,且等于 "true" 时,返回为 true。    
hashCode()    
返回此布尔值对应的哈希码。    
toString()    
返回表示当前布尔值的一个串对象。    
valueOf(String)    

返回表示指定串的布尔值。

6.  String s = new String("xyz");创建了几个String Object?    [中]   

   两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。

7.  String与StringBuffer有什么区别?    [难]   
从表面看来String类只用一个加号(+)便完成了字符串的拼接,而StringBuffer类却要调用一个append()方法,是否实现起来更简洁,更单纯呢?其实不然,让我们了解一下程序运行内部发生了哪些事情:    
  
经编译后程序的bytecode(字节码)展示出了实质: 在用String类对象直接拼接时,JVM会创建一个临时的StringBuffer类对象,并调用其append()方法完成字符串的拼接,这是因为String类是不可变的,拼接操作不得不使用StringBuffer类(并且--JVM会将"You are nice."和"I love you so much."创建为两个新的String对象)。之后,再将这个临时StringBuffer对象转型为一个String,代价不菲!可见,在这一个简单的一次拼接过程中,我们让程序创建了四个对象:两个待拼接的String,一个临时StringBuffer,和最后将StringBuffer转型成为的String--它当然不是最初的str了,这个引用的名称没变,但它指向了新的String对象。    
  
而如果直接使用StringBuffer类,程序将只产生两个对象:最初的StringBuffer和拼接时的String("I love you so much."),也不再需要创建临时的StringBuffer类对象而后还得将其转换回String对象。   
  
short s1 = 1; s1 = s1 + 1;有什么错?   
short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)   
    short s1 = 1; s1 += 1;有什么错?    

short s1 = 1; s1 += 1;(可以正确编译)

8.  是否可以继承String类?   [难]   

String类是final类故不可以继承。

9.  throw与throws有什么区别?    [中]   
throws是用来声明一个方法可能抛出的所有异常信息   
throw则是指抛出的一个具体的异常类型。   
通常在一个方法(类)的声明处通过throws声明方法(类)可能抛出的异常信息,而在方法(类)内部通过throw声明一个具体的异常信息。   
throws通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法;   
throw则需要用户自己捕获相关的异常,而后在对其进行相关包装,最后在将包装后的异常信息抛出。   
  
throws语句   

throws用来标明一个成员函数可能抛出的各种"异常"。对大多数Exception子类来说,Java编译器会强迫你声明在一个成员函数中抛出的"异常"的类型。如果"异常"的类型是Error或RuntimeException,或它们的子类,这个规则不起作用,因为这copy;在程序 的正常部分中是不期待出现的。如果你想明确地抛出一个RuntimeException,你必须用throws语句来声明它的类型。这就重新定义了成员函数的定义语法:type method-name(arg-list) throws exception-list { }下面是一段程序,它抛出了一个"异常", 但既没有捕捉它,也没有用throws来声明。这在编译时将不会通过。

try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?   

会执行,在return前执行。 

10. 常见的runtime exception有哪些?。   [中]   
ArithmeticException,    
ArrayStoreException,    
BufferOverflowException,    
BufferUnderflowException,    
CannotRedoException, CannotUndoException,   
ClassCastException,   
CMMException,    
ConcurrentModificationException,   
DOMException,    
EmptyStackException, IllegalArgumentException,    
IllegalMonitorStateException,    
IllegalPathStateException,    
IllegalStateException,    
ImagingOpException, IndexOutOfBoundsException,    
MissingResourceException,    
NegativeArraySizeException,    
NoSuchElementException, NullPointerException,    
ProfileDataException,    
ProviderException,    
RasterFormatException,    
SecurityException,    
SystemException, UndeclaredThrowableException,    
UnmodifiableSetException,    
UnsupportedOperationException   

NullPointException   

11. 介绍JAVA中的Collection FrameWork(包括如何写自己的数据结构)?    [难]   
答:Collection FrameWork如下:    
Collection    
├List    
│├LinkedList    
│├ArrayList    
│└Vector    
│ └Stack    
└Set    
Map    
├Hashtable    
├HashMap    
└WeakHashMap    
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)    

Map提供key到value的映射    

12. ArrayList和Vector的区别,HashMap和Hashtable的区别  [难]   
答:就ArrayList与Vector主要从二方面来说.    
一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的    
二.数据增长:当需要增长时,Vector 默认增长为原来一培,而ArrayList却是原来的一半    
就HashMap与HashTable主要从三方面来说。   
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现    
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的    

三.值:只有HashMap可以让你将空值作为一个表的条目的key或value 

13. Math.round(11.5)等於多少? Math.round(-11.5)等於多少?    [难]   
Math.round(11.5)==12  
Math.round(-11.5)==-11  

round方法返回与参数最接近的长整数. 

14. swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?  [难]   
switch(expr1)中,expr1是一个整数表达式。应该是 int、 short、 char byte。   

long,string 都不能作用于swtich。

15. GC是什么? 为什么要有GC?    [难]   
GC是垃圾收集的意思(Gabage Collection)   
Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,   

Java语言没有提供释放已分配内存的显示操作方法。

16. 什么叫方法重载   [中]   
方法重载就是一个同名方法,有多种不同的签名 

说白了就是一个同名方法可以传入不同个数或类型的参数之间可以互相调用的,同一个类,同方法名,不同的参数列表

17. 数组有没有length()这个方法? String有没有length()这个方法?  [中]   

数组没有length()这个方法,有length的属性。String有有length()这个方法

18.   什么是抽象类  [中]   

仅提供一个类型的部分实现。抽象类可以有实例变量,以及一个或多个构造函数。抽象类可以同时有抽象方法和具体方法。一个抽象类不会有实例,这些构造函数不能被客户端调用来创建实例。一个抽象类的构造函数可以被其子类调用,从而使一个抽象类的所有子类都可以有一些共同的实现,而不同的子类可以在此基础上有其自己的实现。

19.  抽象类的用途  [中]   

1)  具体类不是用来继承的。 Scott Meyers曾指出,只要有可能,不要从具体类继承。

2)  假设有2个具体类,类A和类B,类B是类A 的子类,那么一个最简单的修改方案是应当建立一个抽象类(或java接口)C,然后让类A和类B成为抽象类C的子类。

3)  抽象类应当拥有尽可能多的共同代码。以提高代码的复用率。

4)  抽象类应当拥有尽可能少的数据。   

20  .java中接口有什么用?   [难]   
java不允许多重继承,也就是说一个子类只能有一个父类,Son extends FatherA,FatherB 是错误的    
为了弥补这点不足,java允许实现多个接口,Son extends FatherA implements AnotherFatherA,AnotherFatherB是允许的    
接口中的方法没有实体,就这一点而言就相当于abstact class,如:    
interface ainter{    
void dosth(int i);    
}    
ainter是一个接口,它仅仅声明了一个方法dosth,而没有具体实现它    
class aclass implements ainter    
{    
public void dosth(int i) {    
  
//在这里你可以不作任何处理,但是必须实现方法体    
}    
}    
aclass实现了ainter这个接口,因此它必须实现ainter中的方法dosth  

22. 垃圾回收机制的原理?  [难]   

在JAVA中 ,JAVA VM 每隔一段时间就会查看每一块由NEW分配的内存空间,看指向它的有效引用是否存在,如果这个引用不存在,系统会自动将这块空间归入空闲内存区.这个过程被称为 垃圾收集. 

23. 什么叫面向对象?   [中]   

面向对象是一种新兴的程序设计方法,或者是一种新的程序设计规范(paradigm),其基本思想是使用对象、类、继承、封装、消息等基本概念来进行程序设计。从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。开发一个软件是为了解决某些问题,这些问题所涉及的业务范围称作该软件的问题域。其应用领域不仅仅是软件,还有计算机体系结构和人工智能等。

24. 面向对象的涉及方法有哪些?   [中]   
 OOA-Object Oriented Analysis     面向对象的分析   
OOD-Object Oriented Design      面向对象的设计        

OOI-Object Oriented Implementation  面向对象的实现

25. jvm工作原理   [难]   
运行jvm 字符码的工作是由解释器来完成的。解释执行过程分三步进行:   
代码的装入、代码的校验、和代码的执行。   
装入代码的工作由“类装载器class loader”完成。类装载器负责装入运   
行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被调   
用的类。当类装载器装入一个类时,该类被放在自己的名字空间中。除了   
通过符号引用自己名字空间以外的类,类之间没有其他办法可以影响其他   
类。在本台计算机的所有类都在同一地址空间中,而所有从外部引进的类   
,都有一个自己独立的名字空间。这使得本地类通过共享相同的名字空间   
获得较高的运行效率,同时又保证它们与从外部引进的类不会相互影响。   
当装入了运行程序需要的所有类后,解释器便可确定整个可执行程序的内   
存布局。解释器为符号引用与特定的地址空间建立对应关系及查询表。通   
过在这一阶段确定代码的内布局,java很好地解决了由超类改变而使子类   
崩溃的问题,同时也防止了代码的非法访问。   
随后,被装入的代码由字节码校验器进行检查。校验器可以发现操作数栈   
益处、非法数据类型转化等多种错误。通过校验后,代码便开始执行了。   
java字节码的执行有两种方式:   
1) 即时编译方式:解释器先将字节编译成机器码,然后再执行该机器码   
。   
2)解释执行方式:解释器通过每次解释并执行一小段代码来完成java字节   
  
码程序的所有操作。   

26. .java中输入输出流有哪些相关的类?  [难]   
Input和Output    
1. stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在Java的IO中,所有的stream(包括Input和Out stream)都包括两种类型:    
  
1.1 以字节为导向的stream    
以字节为导向的stream,表示以字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面几种类型:    
1) input stream:    
1) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用    
2) StringBufferInputStream:把一个String对象作为InputStream    
3) FileInputStream:把一个文件作为InputStream,实现对文件的读取操作    
4) PipedInputStream:实现了pipe的概念,主要在线程中使用    
5) SequenceInputStream:把多个InputStream合并为一个InputStream    
2) Out stream    
1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中    
2) FileOutputStream:把信息存入文件中    
3) PipedOutputStream:实现了pipe的概念,主要在线程中使用    
4) SequenceOutputStream:把多个OutStream合并为一个OutStream    
1.2 以Unicode字符为导向的stream    
以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。以Unicode字符为导向的stream包括下面几种类型:    
1) Input Stream    
1) CharArrayReader:与ByteArrayInputStream对应    
2) StringReader:与StringBufferInputStream对应    
3) FileReader:与FileInputStream对应    
4) PipedReader:与PipedInputStream对应    
2) Out Stream    
1) CharArrayWrite:与ByteArrayOutputStream对应    
2) StringWrite:无与之对应的以字节为导向的stream    
3) FileWrite:与FileOutputStream对应    
4) PipedWrite:与PipedOutputStream对应    
以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,字是在操作时的导向不同。    
如CharArrayReader:和ByteArrayInputStream的作用都是把内存中的一个缓冲区作为InputStream使用,所不同的是前者每次从内存中读取一个字节的信息,而后者每次从内存中读取一个字符。    
1.3 两种不现导向的stream之间的转换    
InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream。    
2. stream添加属性    
2.1 “为stream添加属性”的作用    
运用上面介绍的Java中操作IO的API,我们就可完成我们想完成的任何操作了。但通过FilterInputStream和FilterOutStream的子类,我们可以为stream添加属性。下面以一个例子来说明这种功能的作用。    
如果我们要往一个文件中写入数据,我们可以这样操作:    
FileOutStream fs = new FileOutStream(“test.txt”);    
然后就可以通过产生的fs对象调用write()函数来往test.txt文件中写入数据了。但是,如果我们想实现“先把要写入文件的数据先缓存到内存中,再把缓存中的数据写入文件中”的功能时,上面的API就没有一个能满足我们的需求了。但是通过FilterInputStream和FilterOutStream的子类,为FileOutStream添加我们所需要的功能。    
2.2 FilterInputStream的各种类型    
2.2.1 用于封装以字节为导向的InputStream    
1) DataInputStream:从stream中读取基本类型(int、char等)数据。    
2) BufferedInputStream:使用缓冲区    
3) LineNumberInputStream:会记录input stream内的行数,然后可以调用getLineNumber()和setLineNumber(int)    
4) PushbackInputStream:很少用到,一般用于编译器开发    
2.2.2 用于封装以字符为导向的InputStream    
1) 没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader,否则使用DataInputStream    
2) BufferedReader:与BufferedInputStream对应    
3) LineNumberReader:与LineNumberInputStream对应    
4) PushBackReader:与PushbackInputStream对应    
2.3 FilterOutStream的各种类型    
2.2.3 用于封装以字节为导向的OutputStream    
1) DataIOutStream:往stream中输出基本类型(int、char等)数据。    
2) BufferedOutStream:使用缓冲区    
3) PrintStream:产生格式化输出    
2.2.4 用于封装以字符为导向的OutputStream    
1) BufferedWrite:与对应    
2) PrintWrite:与对应    
3. RandomAccessFile    
1) 可通过RandomAccessFile对象完成对文件的读写操作    
2) 在产生一个对象时,可指明要打开的文件的性质:r,只读;w,只写;rw可读写    
3) 可以直接跳到文件中指定的位置    
4. I/O应用的一个例子    
import java.io.*;    
public class TestIO{    
public static void main(String[] args)    
throws IOException{    
//1.以行为单位从一个文件读取数据    
BufferedReader in =    
new BufferedReader(    
new FileReader("F:\\nepalon\\TestIO.java"));    
String s, s2 = new String();    
while((s = in.readLine()) != null)    
s2 += s + "\n";    
in.close();    
  
//1b. 接收键盘的输入    
BufferedReader stdin =    
new BufferedReader(    
new InputStreamReader(System.in));    
System.out.println("Enter a line:");    
System.out.println(stdin.readLine());    
  
//2. 从一个String对象中读取数据    
StringReader in2 = new StringReader(s2);    
int c;    
while((c = in2.read()) != -1)    
System.out.println((char)c);    
in2.close();    
  
//3. 从内存取出格式化输入    
try{    
DataInputStream in3 =    
new DataInputStream(    
new ByteArrayInputStream(s2.getBytes()));    
while(true)    
System.out.println((char)in3.readByte());    
}    
catch(EOFException e){    
System.out.println("End of stream");    
}    
  
//4. 输出到文件    
try{    
BufferedReader in4 =    
new BufferedReader(    
new StringReader(s2));    
PrintWriter out1 =    
new PrintWriter(    
new BufferedWriter(    
new FileWriter("F:\\nepalon\\ TestIO.out")));    
int lineCount = 1;    
while((s = in4.readLine()) != null)    
out1.println(lineCount++ + ":" + s);    
out1.close();    
in4.close();    
}    
atch(EOFException ex){    
System.out.println("End of stream");    
}    
  
//5. 数据的存储和恢复    
try{    
DataOutputStream out2 =    
new DataOutputStream(    
new BufferedOutputStream(    
new FileOutputStream("F:\\nepalon\\ Data.txt")));    
out2.writeDouble(3.1415926);    
out2.writeChars("\nThas was pi:writeChars\n");    
out2.writeBytes("Thas was pi:writeByte\n");    
out2.close();    
DataInputStream in5 =    
new DataInputStream(    
new BufferedInputStream(    
new FileInputStream("F:\\nepalon\\ Data.txt")));    
BufferedReader in5br =    
new BufferedReader(    
new InputStreamReader(in5));    
System.out.println(in5.readDouble());    
System.out.println(in5br.readLine());    
System.out.println(in5br.readLine());    
}    
catch(EOFException e){    
System.out.println("End of stream");    

27. 构造器Constructor是否可被(覆盖)override?  [难]   

构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

28. JAVA反射机制作用是什么?   [难]   
可以于运行时加载、探知、使用编译期间完全未知的    
classes。换句话说,Java程序可以加载一个运行时才得知名称    
的class,获悉其完整构造(但不包括methods定义),并生成其    

对象实体、或对其fields设值、或唤起其methods1。

29. web应用程序体系结构是怎样的?   [难]   
一般分为表示层、业务层、数据存取层   

30. .GET和POST有什么区别?   [难]   

GET明码传递,url后面的数据大小限制在8k以内

POST暗码传递,传递的数据没有大小限制,更加安全

31. HTTP协议的特点?  [中]   
使用端口发送和接受消息 。端口是协议发送和接收数据的信道或机制 ,80是默认端口   

通过这种协议传递数据服务器不会保存连接信息,因此又称为连接信息。

32. 如何通过RandomAccessFile操作文件  [难]    
RandomAccessFile rf =    
new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");    
for(int i=0; i<10; i++)    
rf.writeDouble(i*1.414);    
rf.close();    
  
rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");    
for(int i=0; i<10; i++)    
System.out.println("Value " + i + ":" + rf.readDouble());    
rf.close();    
  
rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");    
rf.seek(5*8);    
rf.writeDouble(47.0001);    
rf.close();    
  
rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");    
for(int i=0; i<10; i++)    
System.out.println("Value " + i + ":" + rf.readDouble());    
rf.close();    
}    

}    

32. 静态方法有什么好处?  [难] 
(1)在Java里,可以定义一个不需要创建对象的方法,这种方法就是静态方法。要实现这样的效果,只需要在类中定义的方法前加上static关键字。例如:public static int maximum(int n1,int n2)   
使用类的静态方法时,注意:   
a)在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。   
b)静态方法不能以任何方式引用this和super关键字,因为静态方法在使用前不用创建任何实例对象,当静态方法调用时,this所引用的对象根本没有产生。 
(2)静态变量是属于整个类的变量而不是属于某个对象的。注意不能把任何方法体内的变量声明为静态,例如:   
fun()   
{   
   static int i=0;//非法。   
}   
(3)一个类可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且之被执行一次,静态块常用来执行类属性的初始化。例如:   
static  
{   

}   

33. Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?   [中]   

Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判断两个对象是否相等。

34. JSP中动态INCLUDE与静态INCLUDE的区别? [难]   
动态INCLUDE用jsp:include动作实现 <jsp:include page="included.jsp" flush="true" />它总是会检查所含文件中的变化,   
适合用于包含动态页面,并且可以带参数。   

静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面<%@ include file="included.htm" %> 

36. Java有没有goto?   

java中的保留字,现在没有在java中使用。

37. 启动一个线程是用run()还是start()?   [难]   

启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

38. char型变量中能不能存贮一个中文汉字?为什么?   [难]   

可以,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的  

39. Java中的线程有四种状态分别是是什么? [难]   

运行、就绪、挂起、结束。

40. java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?  [难]   
字节流,字符流。   
字节流继承于InputStream \ OutputStream,   

字符流继承于InputStreamReader \ OutputStreamWriter。

41. 什么是java序列化,如何实现java序列化?  [难]   
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。   
序列化的实现:   

将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化   

42. 是否可以从一个static方法内部发出对非static方法的调用? [难]   

不可以,如果其中包含对象的method();不能保证对象初始化.

43. 在JAVA中,如何跳出当前的多重嵌套循环? [难]   

用break; return 方法。

44. 面向对象的特征有哪些方面    [中]   
1.抽象:   
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。   
2.继承:   

继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。  

a) 它可以使用现有类所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

b) 通过继承创建的新类称为“子类”或者“派生类”

c) 被继承的类称为“父类”、“基类”或“超类”

d) 继承的过程,就是一般到特殊的过程

e) 可以通过“继承(Inheritance”和“组合(Composition”来实现

f) 继承概念的实现方式有两种:实现继承和接口继承


3.封装:   

封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。   \

a) 就是把客观事物封装成一个抽象类,并且该类可以把自己的数据和方法只让可信的类或对象操作,对不可信的进行信息隐藏。

b) 说白了,一个类就是封装数以及操作这些数据的代码的逻辑体。

c) 在一个对象内,某些代码或某些数据可以是私有的,不被外界访问,通过这种方式,对象对内部数据提供不同等级的保护,以防止程序中无关部分意外的改变或错误的使用了对象的是有部分。

4. 多态性:   

多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

a) 多态就指一个类的实例的相同方法在不同的情况下有不同的表现形式。

b) 多态机制使具有不同内部结构的对象可以共享相同的外部接口。

c) 最然针对不同对象的具体操作不同,但是通过一个公共类,它们(那些操作)可以通过相同的方式予以调用。

d) 最常见的多态就是将子类传入父类参数,运行时调用父类时通过传入的子类决定具体的内部结构或行为。

45. String是最基本的数据类型吗?  [中]   
基本数据类型包括byte、int、char、long、float、double、boolean和short。   

java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类   

46. int 和 Integer 有什么区别  [中]   

Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。

47. 运行时异常与一般异常有何异同?   [ 难]   

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

48. &和&&的区别。 [ 中]    

&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。

49. final, finally, finalize的区别。  [中]   
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。   
finally是异常处理语句结构的一部分,表示总是执行。   

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

JSP/Servlet 面试题

1. 四种会话跟踪技术是什么?(jsp) (中)   

答:cookie,url重写,session,隐藏表单域。

2.不同客户端可不可以共享Session?不可以 (易)   

    Jps和Servlet之间可不可以用session传值?可以   

3.简介cookie的有关知识 (中)   
浏览器与WEB服务器之间是使用HTTP协议进行通信的,当某个用户发出页面请求时,WEB服务器只是简单的进行响应,然后就关闭与该用户的连接。因此当一个请求发送到WEB服务器时,无论其是否是第一次来访,服务器都会把它当作第一次来对待,这样的不好之处可想而知。为了弥补这个缺陷,Netscape 开发出了cookie这个有效的工具来保存某个用户的识别信息,因此人们昵称为“小甜饼”。cookies是一种WEB服务器通过浏览器在访问者的硬盘上存储信息的手段:Netscape Navigator使用一个名为cookies.txt本地文件保存从所有站点接收的Cookie信息;而IE浏览器把Cookie信息保存在类似于C: \windows\cookies的目录下。当用户再次访问某个站点时,服务端将要求浏览器查找并返回先前发送的Cookie信息,来识别这个用户。   
  cookies给网站和用户带来的好处非常多:   
3.1)、Cookie能使站点跟踪特定访问者的访问次数、最后访问时间和访问者进入站点的路径   
3.2)、Cookie能告诉在线广告商广告被点击的次数 ,从而可以更精确的投放广告   
3.3)、Cookie有效期限未到时,Cookie能使用户在不键入密码和用户名的情况下进入曾经浏览过的一些站点   
3.4)、Cookie能帮助站点统计用户个人资料以实现各种各样的个性化服务    
JSP是使用如下的语法格式来创建cookie的:   
  Cookie cookie_name =new Cookie(""Parameter"",""Value"");   

  例如:Cookie newCookie =new Cookie(""username"",""zheng""); response.addCookie(newCookie);  

4.在浏览器的打开时再新打开一个浏览器还是同一个session吗? (中)   

对IE而言不是同一个SESSION  

5.描述Cookie和Session的作用,区别和各自的应用范围 (中)   

Cookie和Session都可以用来在多个页面之间共享数据,区别是Cookie保存在客户端,可以设置比较长的保存时间.而Session保存在服务器端,通常生存时间较短。如果客户端禁用了Cookie,Cookie将无法工作,而session不受这一影响。一般来说保密性高、保存时间短的信息适合用session来存放,而Cookie适合存放需要长期保存的非敏感数据。

6.如何实现购物车添加新项,又不使购物车中原有项目被取消? (易)   

可以将购物车存放在session当中

7.Cookie的过期时间如何设置? (易)   

使用setMaxAge(int exp)方法

8.如果BROWSER已关闭了cookies,在JSP中我如何打开session? (中)  
如果Cookie被禁用,session将通过url重写的方式来传送,所以不会影响session的使用  

9. Jsp有哪些常用动作?作用分别是什么?(jsp)  (中)   
答:JSP有6种常用基本动作 jsp:include:在页面被请求的时候引入一个文件。    
jsp:useBean:寻找或者实例化一个JavaBean。    
jsp:setProperty:设置JavaBean的属性。    
jsp:getProperty:输出某个JavaBean的属性。    
jsp:forward:把请求转到一个新的页面。    

jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记。

10. "forward与redirect区别? (中)   

Forward是在服务器端进行分发,分发后地址栏无变化,用户看不到分发后的地址.而redirect是在客户端进行的页面重定向,地址栏上会显示重定向后的网页.forward的页面只能是在同一个web应用程序之内,而重定向可以定位到外部资源.forward后还是同一个request请求,而重定向后以前的request请求就不存在了.   

11.Jsp和Servlet中的请求转发分别如何实现? (易)   

Jsp中使用<jsp:forward>动作,servlet中使用RequestDistpatcher对象的forward方法" 

 12.什么是web容器?(易)   

答:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接更容器中的环境变量接口交互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。   

13.应用服务器有那些? (中)   

答:BEA WebLogic Server,IBM WebSphere Application Server,Oracle9i Application Server,JBoss,Tomcat。

14.请说出JSP的内置对象及方法 (中)   

答:request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie

    header, 和session数据的有用的方法。   

    response表示HttpServletResponse对象,并提供了几个用于设置送回    
浏览器的响应的方法(如cookies,头信息等)   
    out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。   
    pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。   
    session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息   
    applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息   
    config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。   
page表示从该页面产生的一个servlet实例。

17.B/S与C/S的联系与区别。  (中)   
答:C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、Informix或    
SQL Server。客户端需要安装专用的客户端软件。   
B/S是Brower/Server的缩写,客户机上只要安装一个浏览器(Browser),如Netscape    
Navigator或Internet Explorer,服务器安装Oracle、Sybase、Informix或 SQL    
Server等数据库。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过Web    
Server 同数据库进行数据交互。   
C/S 与 B/S 区别:   
1).硬件环境不同:   
  C/S 一般建立在专用的网络上, 小范围里的网络环境,    
局域网之间再通过专门服务器提供连接和数据交换服务.   
  B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备.    
信息自己管理. 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行   
2).对安全要求不同   
  C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强.    
一般高度机密的信息系统采用C/S 结构适宜. 可以通过B/S发布部分可公开信息.   
  B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。   
3).对程序架构不同   
  C/S 程序可以更加注重流程, 可以对权限多层次校验,    
对系统运行速度可以较少考虑.   
  B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上.    
比C/S有更高的要求 B/S结构的程序架构是发展的趋势, 从MS的.Net系列的BizTalk    
2000 Exchange 2000等, 全面支持网络的构件搭建的系统. SUN 和IBM推的JavaBean    
构件技术等,使 B/S更加成熟.   
4).软件重用不同   
  C/S 程序可以不可避免的整体性考虑,    
构件的</ div <> 

猜你喜欢

转载自blog.csdn.net/RightBeforeTheSix/article/details/80051482