1、列举出 JAVA 中 6 个比较常用的包【天威诚信面试题】
【参考答案】
java.lang;java.util;java.io;java.sql;java.awt;java.net;javax.swing
2、JDK 中哪些类是不能继承的?【信雅达面试题】
【参考答案】
不能继承的是类是那些用 final 关键字修饰的类。一般比较基本的类型或防止扩展类无
意间破坏原来方法的实现的类型都应该是 final 的。
3、String 是最基本的数据类型吗? 【天能智健面试题】
【参考答案】
基本数据类型包括 byte、int、char、long、float、double、boolean 和 short。
所以 String 不属于基本数据类型范畴内,但 String 属于最常见一种引用类型。
4、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 【博炎科
技面试题】
【参考答案】
对于 short s1 = 1; s1 = s1 + 1; 由于 s1+1 运算时会自动提升表达式的类型,所以结
果是 int 型,再赋值给 short 类型 s1 时,编译器会提示错误,需要强制转换类型。
对于 short s1 = 1; s1 += 1;由于 += 是 java 语言规定的运算符,Java 编译器会对它
进行特殊处理,因此可以正确编译。
【分析】
主要考查几种基本数据类型在运算时的,由低到高会自动转换,而由高到低时会强制转
换。
5、Java 对象初始化顺序?【腾鹏科技面试题】
【参考答案】
分为两种,一种是本类的初始化,一种是含有父类的初始化顺序。这里分开来说,
本类的初始化顺序是:静态变量、静态初始化块、变量、初始化块、构造函数
继承类的初始化顺序是:父类静态变量、父类静态初始化块、子类静态变量、子类静态初
始块、父类变量、父类初始化块、父类构造函数、子类变量、子类初始化块、子类构造函数。
【分析】
static{
System.out.println(“静态块”);
}
{
System.out.println(“初始化模块”); }
public ClassName() {
System.out.println(“构造方法”);
}
说明:
原则上回答全面的话,应该是完整的说出带有继承的这种类的初始化过程,下面有个步骤
可以参考:
1.装载程序的时候首先找到的是它的基(父)类,如果有多层基(父)类则会一级一级的
往上找最后找到根基(父)类。
2.执行根基础(父)类中的 static 初始化,再执行下一个衍生类中的 static,依此类推,一直
保持这个顺序。
3.此时类已经装载完毕,开始创建对象,所有的基本数据类型都会设成它们的默认值,对象
句柄设为 null
4.调用基础(父)类的构造方法,基础(父)类的构建采用与衍生类构造方法完全相同的
处理过程。
5.构造方法初始完之后,进行变量的初始化。
6.执行构造方法中剩余的部分。
6、写几个线程安全类,不安全的,支持排序的类名?【软通动力面试题】
【参考答案】
线程安全类:Vector 、Hashtable、Stack。
线程不安全的类:ArrayList、Linkedlist、HashSet、TreeSet、HashMap、TreeMap
等。
支持排序的类有 HashSet、LinkedHashSet、TreeSet 等(Set 接口下的实现都支持
排序)
【分析】
此题主要考查集合框架的知识。在集合框架中 Collection 接口为集合的根类型,提供
集合操作的常用 API 方法,该接口下派生出两个子接口,一个是不支持排序的 List 接口,
一个是有自身排序的 Set 接口,所以回答排序与不排序分别从两接口的实现中在作答。线程
安全上来说,Vector 类比同属于 List 接口的 ArrayList 要早,是一个线程安全的类,在
JDK1.2 以后才推出一个异步的 ArrayList 类,比 Vector 类效率高。同理 Stack 继承自 Vector
也线程安全的类,另外在在 Map 接口的实现在 Hashtable 也是个线程安全的类。
7、哪几个方法可以实现一个线程?【上海华信面试题】
【参考答案】
一是继承 Thread ,重写 Thread 类的方法 run 方法;另种是实现 runnable 接口并实
现 run 方法。
【分析】
考查线程的基本实现,很多公司喜欢考查这方面知识,另外补充一下关于线程的 run
方法,在多线程 API 中启动一个线程是调用 start()方法,线程进入就绪状态。
8、STOP()和 SUSPEND()不推荐使用的原因?
【参考答案】
stop()是因为它不安全。它会解除由线程获取的所有锁定,当在一个线程对象上调用 stop()
方法时,这个线程对象所运行的线程就会立即停止,假如一个线程正在执行:synchronized
void { x = 3; y = 4;} 由于方法是同步的,多个线程访问时总能保证 x,y 被同时赋值,而如果
一个线程正在执行到 x = 3;时,被调用了 stop()方法,即使在同步块中,它也干脆地 stop 了,
这样就产生了不完整的残废数据。而多线程编程中最最基础的条件要保证数据的完整性,所以请忘记线程的 stop 方法,以后我们再也不要说“停止线程”了。而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。
suspend()方法容易发生死锁。调用 suspend()的时候,目标线程会停下来,但却仍然持有
在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢
复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,
就 会造成死锁。所以不应该使用 suspend(),而应在自己的 Thread 类中置入一个标志,指出
线程应该活动还是挂起。若标志指出线程应该挂起,便用 wait()命其进入等待状态。若标志
指出线程应当恢复,则用一个 notify()重新启动线程。
【分析】
9、""和 equals 方法有什么区别?【中科软】
【参考答案】
操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所
存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用操作
符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用
一块内存(堆内存),变量也占用一块内存,例如 Objet obj = new Object();变量 obj 是
一个内存,new Object()是另一个内存,此时,变量 obj 所对应的内存中存储的数值就是对
象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一
个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用操作符进行
比较。
equals 方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否
相同,它比较的两个对象是独立的。例如,对于下面的代码:
String a=new String(“foo”);
String b=new String(“foo”);
两条 new 语句创建了两个对象,然后用 a,b 这两个变量分别指向了其中一个对象,这是
两个不同的对象,它们的首地址是不同的,即 a 和 b 中存储的数值是不相同的,所以,表达
式 ab 将返回 false,而这两个对象中的内容是相同的,所以,表达式 a.equals(b)将返回
true。
在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input
= …;input.equals(“quit”),如果一个类没有自己定义 equals 方法,那么它将继承 Object
类的 equals 方法,Object 类的 equals 方法的实现代码如下:
boolean equals(Object o){
return thiso;
}
这说明,如果一个类没有自己定义 equals 方法,它默认的 equals 方法(从 Object 类
继承的)就是使用操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用
equals 和使用会得到同样的结果,如果比较的是两个独立的对象则总返回 false。如果你
编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖 equals
方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。
10、静态变量和实例变量的区别?
【参考答案】
在语法定义上的区别:静态变量前要加 static 关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实
例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于
类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就
会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个
对象来使用,静态变量则可以直接使用类名来引用。
例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个 staticVar 变
量,并且每创建一个实例对象,这个 staticVar 就会加 1;但是,每创建一个实例对象,就
会分配一个 instanceVar,即可能分配多个 instanceVar,并且每个 instanceVar 的值都只
自加了 1 次。
public class VariantTest
{
public static int staticVar = 0;
public int instanceVar = 0;
public VariantTest()
{
staticVar++;
instanceVar++;
System.out.println(“staticVar=” + staticVar + ”,instanceVar=” +
instanceVar);
}
}
备注:这个解答除了说清楚两者的区别外,最后还用一个具体的应用例子来说明两者的
差异,体现了自己有很好的解说问题和设计案例的能力,思维敏捷,超过一般程序员,有写
作能力!
11、构造器的名能不能和类的名字相同?
【参考答案】
构造器的名称必须与类名相同。
【分析】
构造器或构造函数(有些书这样叫)主要用来对类的成员变量进行初始化,当类创建
实例时调用。
12、在一个主方法类可不可以调用一个静态的方法?
【参考答案】
可以调用。因为 Java 的主方法(main)方法本身也是 static 类型方法,一个 static
类型方法,发起对另一个 static 方法的调用没有问题。
【分析】
静态方法可以调用其它的静态方法,但是不能调用非静态方法,这个好比 Java 中的类
变量与实例变量的关系。类变量是被所有类成员共享,而实例变量只被该实例共享,
13、一个类中可不可以有 2 个公共的方法?
【参考答案】
可以。Java 中对公共方法的个数没有约束,但是对公共的类有约束,一个 Java 源文件
中只能定义一个 public 类型的类。
14、GC 是什么,为什么要使用它?【阿斯拓】
【参考答案】
GC 是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地
方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可
以自动监测对象是否超过作用域,从而达到自动回收内存的目的,Java 语言没有提供释放
已分配内存的显示操作方法。
【分析】
15、说一下垃圾回收的原理,可以直接从内存中回收吗?
【参考答案】
Java 语言中一个显著的特点就是引入了垃圾回收机制,使 c++程序员最头疼的内存管理
的问题迎刃而解,它使得 Java 程序员在编写程序的时候不再需要考虑内存管理。垃圾回收
可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的
低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进
行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收,因
为 Java 语言规范并不保证 GC 一定会执行。回收机制有分代复制垃圾回收和标记垃圾回收,
增量垃圾回收。
【分析】
16、Java 的异常有哪几种,有什么区别?
【参考答案】
两大类,一般异常和运行时异常。一般异常,这些异常是在定义方法时声明抛出的,这
些异常必需用 try catch 抛出,或 throws 处理,如果不处理,程序将编译失败。比如:
IOException、FileNotFoundException、SQLException 等。
运行时异常是程序运行时可能报出的异常。可以用 try catch 抓取,也可以不做任何处理。例
如:NullPointerException 异常就是一种比较常见的运行时异常。
【分析】
17、switch 语句能否作用在 byte 上,能否作用在 long 上,能否作用在 String 上?
【参考答案】
在 switch(表达式)中,括号表达式只能是一个整数表达式或者枚举常量(更大字体),
整数表达式可以是 int 基本类型或 Integer 包装类型,由于,byte,short,char 都可以隐含
转换为 int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long 和 String
类型都不符合 switch 的语法规定,并且不能被隐式转换成 int 类型,所以,它们不能作用
于 swtich 语句中。
18、Integer 与 int 的区别?
【参考答案】
int 是 java 提供的 8 种原始数据类型之一,另外 Java 为每个原始类型提供了封装类,
Integer 是 java 为 int 提供的封装类。int 的默认值为 0,而 Integer 的默认值为 null,即
Integer 可以区分出未赋值和值为 0 的区别,int 则无法表达出未赋值的情况。
19、Java Reflection 是什么?【】
【参考答案】
JAVA 反射,Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程
序对自身进行检查,或者说"自审",并能直接操作程序的内部属性。
【分析】
20、写几个 java.lang.Object 类中的方法名称。
【参考答案】
主要有 equals()、toString()、getClass()、hashCode()、clone()、notify()、wait()、
notify()方法。
【分析】
这种题能记多少个就说多少个,不一定要求你所有的都记住,但是要理解其中部分重要
方法的含义和作用。
21、&和&&的区别?
【参考答案】
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果
都为 true 时,整个运算结果才为 true,否则,只要有一方为 false,则结果为 false。
&&还具有短路的功能,即如果第一个表达式为 false,则不再计算第二个表达式。
&还可以用作位运算符,当&操作符两边的表达式不是 boolean 类型时,&表示按位与操
作,我们通常使用 0x0f 来与一个整数进行&运算,来获取该整数的最低 4 个 bit 位。
【分析】
先说分别说两者的作用,再说出&&和&各自的不同之处。
22、数组有没有 length()这个方法,String 有没有 length()这个方法。
【参考答案】
数组没有 length()方法,但有 length 属性
String 有 length()方法。
【分析】
考查平时使用数组和字符串的一些细节,一般在使用
23、String s=new String(“xyz”)创建了几个对象
【参考答案】
2 个 string 对象,一个是=null 的 s,一个是=“xyz”的 string
两个或一个”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管
出现多少遍,都是缓冲区中的那一个。New String 每写一遍,就创建一个新的对象,它一
句那个常量”xyz”对象的内容来创建出一个新 String 对象。如果以前就用过’xyz’,这句
代表就不会创建”xyz”自己了,直接从缓冲区拿。
【分析】
24、能不能自己写个类,也叫 java.lang.String?
可以,但在应用的时候,需要用自己的类加载器去加载,否则,系统的类加载器永远只
是去加载jre.jar包中的那个java.lang.String。由于在tomcat的web应用程序中,都是由
webapp自己的类加载器先自己加载WEB-INF/classess目录中的类,然后才委托上级的类加载
器加载,如果我们在tomcat的web应用程序中写一个java.lang.String,这时候Servlet程序
加载的就是我们自己写的java.lang.String,但是这么干就会出很多潜在的问题,原来所有
用了java.lang.String类的都将出现问题。
虽然java提供了endorsed技术,可以覆盖jdk中的某些类,具体做法是….。但是,能够被覆
盖的类是有限制范围,反正不包括java.lang这样的包中的类。
例如,运行下面的程序:
package java.lang;
public class String {
/**
- @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(“string”);
}
}
报告的错误如下:
java.lang.NoSuchMethodError: main
Exception in thread “main” 这是因为加载了jre自带的java.lang.String,而该类中没有main方法。
25、你对面向对象思想的理解?
【参考答案】
面向对象编程(Object-Oriented Programming)简称 OOP 技术,是开发计算机应用程序
的一种新方法、新思想。过去的面向过程编程中常常会导致所有的代码都包含在几个模块中,
使程序难以阅读和维护,在做一些修改时常常牵一动百,使以后的开发和维护难以为继。而
使用 OOP 技术,使用许多代码模块,每个模块都只提供特定的功能,它们是彼此独立的,
可以增加代码重用的几率,更加有利于软件的开发、维护和升级。另外 OOP 的三大核心特
性:继承、封装、多态的特性,使得在面对象编上能够设计出高内聚、低耦合的系统结构,
使得系统更灵活、更容易扩展,而且成本较低,所以这一编程思想是目前一种应用最为普遍
的软件设计思想。
【分析】
26、最常见的 runtime exception 运行时异常?
【参考答案】
ClassCastException(类型转换异常)、NumberFormatException(格式化异常)、
ArrayIndexOutOfBoundsException(数组越界异常)、ArithmeticException(算术异常)、
NullPointerException(空指针异常)等等
【分析】
这道题主要考查大家平时在项目开发过程中经常遇到的一些异常类型信息,通过这些异
常来考查大家的项目经验与项目排错能力。
27、用 JDBC 来实现访问数据库记录可以采用下面的几个步骤:
【参考答案】
1、 通过驱动器管理器获取连接接口(Connection)。
2、 获得 Statement 或它的子类。
3、 指定 Statement 中的参数。
4、 通过 Statement 发送 SQL 语句。
5、 检查并处理返回的结果。
6、 关闭 Statement。
7、 关闭连接接
【分析】
28、Error 和 exception 的区别与联系?
【参考答案】
error 表示恢复不是不可能,但很困难的情况下的一种严重问题。比如说内存溢,网络
故障等,不可能指望程序能处理的一类错误。
Exception 表示一种由程序设计或实现问题,像我们常说的异常处理,就是属于这类,
一般程序可以捕获和处理这些异常。
【分析】
这道题的难点在Error很多时候由于我们无法重现这种Error导致很多同学甚至不知道
Error 到底是什么,所以很容易把题目中的两种错误划上等号。
29、String s = “Hello”;s = s + " world!";这两行代码执行后,原始的 String
对象中的内容到底变了没有?
【参考答案】
没有。因为 String 被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。
在这段代码中,s 原先指向一个 String 对象,内容是 “Hello”,然后我们对 s 进行了+操作,
那么 s 所指向的那个对象是否发生了改变呢?答案是没有。这时,s 不指向原来那个对象了,
而指向了另一个 String 对象,内容为"Hello world!",原来那个对象还存在于内存之中,
只是 s 这个引用变量不再指向它了。
通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或
者说,不可预见的修改,那么使用 String 来代表字符串的话会引起很大的内存开销。因为
String 对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个 String 对象
来表示。这时,应该考虑使用 StringBuffer 类,它允许修改,而不是每个不同的字符串都
要生成一个新的对象。并且,这两种类的对象转换十分容易。
同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都 new 一个 String。例
如我们要在构造器中对一个名叫 s 的 String 引用变量进行初始化,把它设置为初始值,应
当这样做:
public class Demo {
private String s;
…
public Demo {
s = “Initial Value”;
}
…
}
而非s = new String(“Initial Value”);后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为 String对象不可改变,所以对于内容相同的字符串,只要一个 String 对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的 String 类型属性 s 都指向同一个对象。
上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java 认为它们代表同一个 String 对象。而用关键字 new 调用构造器,总是会创建一个新的对象,无论内容是否相同。至于为什么要把 String 类设计成不可变类,是它的用途决定的。其实不只 String,很多 Java标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以 Java 标准类库还提供了一个可变版本,即 StringBuffer。
30、Jdk1.5 的新特性?
【参考答案】
JDK1.5 的一个重要主题就是通过新增一些特性来简化开发,这些特性主要包括:泛型、
ForEach 循环、自动装包/拆包、枚举、可变参数、静态导入这些。
【分析】
31、面向对象的特征有哪些方面?
【参考答案】
面向对象的编程语言有封装、继承 、多态等 3 个主要的特征。
封装
封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高
内聚、低耦合”,防止程序相互依赖性而带来的变动影响。面向对象的封装就是把描述一个
对象的属性和行为的代码封装在一个“模块”中,也就是一个类中,属性用变量定义,行为
用方法进行定义,方法可以直接访问同一个对象中的属性。
继承
在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经
存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之
更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间
的一种关系,提高了软件的可重用性和可扩展性。
多态
多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用
在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例
对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能
决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量
绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码
就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
多态性增强了软件的灵活性和扩展性。
32、JVM 工作原理?
运行 jvm 字符码的工作是由解释器来完成的。解释执行过程分三步进行:
代码的装入、代码的校验、和代码的执行。
装入代码的工作由“类装载器 class loader”完成。类装载器负责装入运行一个程序需要的
所有代码,这也包括程序代码中的类所继承的类和被调用的类。当类装载器装入一个类时,
该类被放在自己的名字空间中。除了通过符号引用自己名字空间以外的类,类之间没有其他
办法可以影响其他类。在本台计算机的所有类都在同一地址空间中,而所有从外部引进的类,
都有一个自己独立的名字空间。这使得本地类通过共享相同的名字空间获得较高的运行效
率,同时又保证它们与从外部引进的类不会相互影响。当装入了运行程序需要的所有类后,
解释器便可确定整个可执行程序的内存布局。解释器为符号引用与特定的地址空间建立对应
关系及查询表。通过在这一阶段确定代码的内布局,java 很好地解决了由超类改变而使子类
崩溃的问题,同时也防止了代码的非法访问。随后,被装入的代码由字节码校验器进行检查。
校验器可以发现操作数栈益处、非法数据类型转化等多种错误。通过校验后,代码便开始执
行了。
Java 字节码的执行有两种方式:
1)即时编译方式:解释器先将字节编译成机器码,然后再执行该机器码。
2)解释执行方式:解释器通过每次解释并执行一小段代码来完成 java 字节。
码程序的所有操作。
33、说说 Java 中的内存分配?
Java 把内存分成两种,一种叫做栈内存,一种叫做堆内存
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一
段代码块中定义一个变量时,java 就在栈中为这个变量分配内存空间,当超过变量的作用域
后,java 会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作它用。
堆内存用于存放由 new 创建的对象和数组。在堆中分配的内存,由 java 虚拟机自动垃
圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,
这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了
数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组
或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。
引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。
而数组&对象本身在堆中分配,即使程序运行到使用 new 产生数组和对象的语句所在地代
码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它
的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃
圾回收器释放掉。这个也是 java 比较占内存的主要原因。但是在写程序的时候,可以人为
的控制。
34、final, finally, finalize 的区别。
【参考答案】
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
内部类要访问局部变量,局部变量必须定义成 final 类型,例如,一段代码……
finally 是异常处理语句结构的一部分,表示总是执行。
finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,
可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM 不保证此方法总被
调用
35、Extends 和 Implement 的不同?
【参考答案】
extends 是继承父类,只要那个类不是声明为 final 或者那个类定义为 abstract 的就
能继承,JAVA 中不支持多重继承,但是可以用接口来实现,这样就要用到 implements,继
承只能继承一个类,但 implements 可以实现多个接口,用逗号分开就行了
比如 class A extends B implements C,D,E
36、抽象类是否可以没有抽象方法?为什么?
【参考答案】
可以在 java 中用 abstract 关键字来修饰一个类时,这个类叫做抽象类。
抽象类中不一定要包含 abstract 方法,但一个类中包含了 abstract 方法,则这个类必
须声明为 abstract 类。
37、静态的多态和动态的多态的区别?
【参考答案】
静态的多态: 即为重载 ;方法名相同,参数个数或类型不相同。(overloading)
动态的多态: 即为重写;子类覆盖父类的方法,将子类的实例传与父类的引用调用的是
子类的方法 实现接口的实例传与接口的引用调用的实现类的方法。
38、说出一些常用的类,包,接口,请各举 5 个?
【参考答案】
常用的类:String、StringBuffer、 Integer 、Vector、ArrayList、Hashtable等
常用的包:java.lang java.io java.util 、java.sql 。
常用的接口:集合中的List、Set、 Map接口;与Servlet API相关的Servlet接口、
HttpServletRequest,HttpServletResponse,HttpSession接口等。
39、Collections 和 Collection 的区别【天晟科技】
【参考答案】
Collection 是个 java.util 下的接口,它是各种集合结构的父接口,定义了集合对
象的基本操作方法。Collections 是个 java.util 下的工具类,它包含有各种有关集合操
作的静态方法,主要是针对集合类的一个帮助类或者叫包装类,它提供一系列对各种集合
的搜索,排序,线程安全化等操作方法。
40、Class.forName 的作用?为什么要用?
【参考答案】
按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载
过,则返回代表该字节码的 Class 实例对象,否则,按类加载器的委托机制去搜索和加载该
类,如果所有的类加载器都无法加载到该类,则抛出 ClassNotFoundException。加载完这
个 Class 字节码后,接着就可以使用 Class 字节码的 newInstance 方法去创建该类的实例对
象了。有时候,我们程序中所有使用的具体类名在设计时(即开发时)无法确定,只有程序
运行时才能确定,这时候就需要使用 Class.forName 去动态加载该类,这个类名通常是在配
置文件中配置的,例如,spring 的 ioc 中每次依赖注入的具体类就是这样配置的,jdbc 的
驱动类名通常也是通过配置文件来配置的,以便在产品交付使用后不用修改源程序就可以更
换驱动类名。
41、Socket 如何获取本地 ip 地址?
【参考答案】
InetAddress 类提供的 API 来访问。InetAddress.getLocalAddress()
【分析】
42、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体
类【天威诚信面试题】
【参考答案】
接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承具体类。抽
象类中可以有静态的 main 方法。
备注:只要明白了接口和抽象类的本质和作用,这些问题都很好回答,你想想,如果你
是 java 语言的设计者,你是否会提供这样的支持,如果不提供的话,有什么理由吗?如果
你没有道理不提供,那答案就是肯定的了。
只有记住抽象类与普通类的唯一区别就是不能创建实例对象和允许有 abstract 方法。
43、用最有效率的方法算出 2 乘以 8 等於几?
【参考答案】
2 << 3
【分析】
因为将一个数左移 n 位,就相当于乘以了 2 的 n 次方,那么,一个数乘以 8 只要将其左
移 3 位即可,而位运算 cpu 直接支持的,效率最高,所以 2 乘以 8 等於几的最效率的方法是
2 << 3。
44、char 型变量中能不能存贮一个中文汉字?为什么?
【参考答案】
char 型变量是用来存储 Unicode 编码的字符的,unicode 编码字符集中包含了汉字,所
以,char 型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在 unicode
编码字符集中,那么,这个 char 型变量中就不能存储这个特殊汉字。补充说明:unicode
编码占用两个字节,所以,char 类型的变量也是占用两个字节。
45、写 clone()方法时,通常都有一行代码,是什么?
【参考答案】
clone 有缺省行为,super.clone();因为首先要把父类中的成员复制到位,然后才是复制自
己的成员。
46、说说常用集合类有哪些?有哪些方法?
【参考答案】
通常我们使用的集合类都大多是由 List、Set、Map 这三类接口派生出来的类,例如:
ArrayList、Vector、LinkedList、Stack、TreeSet、Hashtable、HashMap 等
集合类的大部分方法都是由 Collection 接口定义的,主要包括有:
add(E e)、remove(Object e)、addAll(),remove()、contains(Object obj)、clear()
等
47、请说出作用域 public,private,protected,以及不写时的区别?【天威诚信面试题】
【参考答案】
这四个作用域的可见范围如下表所示。
说明:如果在修饰的元素上面没有写任何访问修饰符,则表示 friendly。
作用域 同一类 同一 package 子孙类 其他 package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
备注:只要记住了有 4 种访问权限,4 个访问范围,然后将全选和范围在水平和垂直方
向上分别按排从小到大或从大到小的顺序排列,就很容易画出上面的图了。
48、构造器 Constructor 是否可被 override? 【亿阳通讯面试题】
【参考答案】
构造器 Constructor 不能被继承,因此不能重写 Override,但可以被重载 Overload。
49、是否可以从一个 static 方法内部发出对非 static 方法的调用? 【世承软件面试题】
【参考答案】
不可以。因为非 static 方法是要与对象关联在一起的,必须创建一个对象后,才可以
在该对象上进行方法调用,而 static 方法调用时不需要创建对象,可以直接调用。
50、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?【雾隐美地传媒】
【参考答案】
Math 类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它
们的英文名称的含义相对应,例如,ceil 的英文意义是天花板,该方法就表示向上取整,
所以,Math.ceil(11.3)的结果为 12,Math.ceil(-11.3)的结果是-11;floor 的英文意义是
地板,该方法就表示向下取整,所以,Math.floor(11.6)的结果为 11,Math.floor(-11.6)
的结果是-12;最难掌握的是 round 方法,它表示“四舍五入”,算法为 Math.floor(x+0.5),
即 将 原 来 的 数 字 加 上 0.5 后 再 向 下 取 整 , 所 以 , Math.round(11.5)的 结 果 为 12,
Math.round(-11.5)的结果为-11。