Java基础知识

1, Java语言是由()语言改进并设计而来的。 (p46)

A,Ada B,c++ C,Pascal D,BASIC
参考答案:B。java语言是一种面向对象语言,从语法结构上看,与c++类似。

2,下列说法中,错误的有() (p48)

A, Java面向对象语言容许单独的过程与函数存在
B, Java面向对象语言容许单独的方法存在
C, Java语言中的方法属于类中的成员(member)
D,Java语言中的方法必定隶属于某一类(对象),调用方法与过程或函数相同
参考答案:A、B、C。Java为纯面向对象语言,所有代码(包括函数、变量等)必须在类中实现,除基本数据类型(包括int、float等)外,所有类型都是类。

3,(p48)

  1. public class Test{
  2. public static void main(String[] args) {
  3. for(inti=0;i<args.length;i++){
  4. System.out.println(args[i]);
  5. }
  6. }
  7. }

程序运行结果为:
参考答案:使用java Test arg1 arg2 arg3指令运行程序,结果为:
arg1
arg2
arg3

引申1:main()方法是否还有其他可用的定义格式? (p48)

参考答案:有。
1)public与static没有先后顺序。
2)也可以把main方法定义为final。
3)也可以用synchronized来修饰main()方法。
引申2:同一个.java文件中是否可以有多个main()方法? (p49)
参考答案:虽然每个类中都可以定义main()方法,但是只有与文件名相同的用public修饰的类中的main()方法才能作为整个程序的入口方法。

4,(p49)

  1. class T{
  2. public static void main(String[] args) {
  3. System.out.println("T main");
  4. }
  5. }
  6. public class Test{
  7. //程序入口函数
  8. public static void main(String[] args) {
  9. System.out.println("Testmain");
  10. }
  11. }

程序运行结果为:
参考答案:Test main。解析见上引申2

5,Java程序中程序运行入口方法main的签名正确的有()。 (p49)

A, public static void main(String[] args)
B, public static final void main(String[] args)
C, static public void main(String[] args)
D,static public synchronized void main(String[] args)
E, static public abstract void main(String[] args)
参考答案:A、B、C、D。解析见上引申1

6,(p49)

  1. public class Test{
  2. static{
  3. System.out.println("Hello Word1");
  4. }
  5. publicstatic void main(String[] args) {
  6. System.out.println("HelloWord2");
  7. }
  8. }

程序运行结果:
参考答案:
HelloWord1
Hello Word2
解析:在Java语言中,由于静态块在类加载时就会被调用,因此可以在main()方法执行前,先执行静态块。(即静态快不管顺序如何,都会在main()方法执行之前就执行。)

7, (p50)

  1. public class Test {
  2. public static void main(String[] args) {
  3. System.out.println("HelloWord2");
  4. }
  5. static{
  6. System.out.println("Hello Word1");
  7. }
  8. }

程序运行结果:
参考答案:
HelloWord1
Hello Word2

8,(p50)

  1. class Base {
  2. static {
  3. System.out.println("Base static block");
  4. }
  5. {
  6. System.out.println("Base block");
  7. }
  8. public Base() {
  9. System.out.println("Base constructor");
  10. }
  11. }
  12. public class Derived extends Base {
  13. static {
  14. System.out.println("Derived static block ");
  15. }
  16. {
  17. System.out.println("Derived block");
  18. }
  19. public Derived() {
  20. System.out.println("Derived constructor");
  21. }
  22. public static void main(String[] args) {
  23. new Derived();
  24. }
  25. }

参考答案:
Basestatic block
Derived static block
Base block
Base constructor
Derived block
Derived constructor
解析:Java程序的初始化一般遵循3个原则(优先级依次减弱):1)静态对象(变量)优先于非静态对象(变量)初始化。其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次。2)父类优先于子类进行初始化。3)按照成员变量的定义顺序进行初始化。即使变量定义散布于方法定义之中,它们依然在任何方法(包括构造函数)被调用之前先初始化。
Java程序初始化工作的执行顺序为:父类静态变量>父类静态代码块>子类静态变量>子类静态代码块>父类非静态变量>父类非静态代码块>父类构造函数>子父类非静态变量>子类非静态代码块>子类构造函数。

9,(p50)

  1. class B extends Object {
  2. static {
  3. System.out.println("Load B1");
  4. }
  5. public B() {
  6. System.out.println("Create B");
  7. }
  8. static {
  9. System.out.println("Load B2");
  10. }
  11. }
  12. class A extends B {
  13. static {
  14. System.out.println("Load A");
  15. }
  16. public A() {
  17. System.out.println("Create A");
  18. }
  19. }
  20. public class TestClass {
  21. static {
  22. System.out.println("Hello Word1");
  23. }
  24. public static void main(String[] args) {
  25. new A();
  26. }
  27. }

A, Load B1 Load B2 Create B Load A Create A
B, Load B1 Load B2 Load A Create B Create A
C, Load B2 Load B1 Create B Create A Load A
D,Create B CreateA Load B1 Load B2 Load A
参考答案: B。HelloWord1、Load B1、Load B2、Load A、Create B、CreateA

10,下列说法中,正确的是() (p52)

A, 实例方法可直接调用超类的实例方法
B, 实例方法可直接调用超类的类方法
C, 实例方法可直接调用其他类的实例方法
D,实例方法可直接调用本类的类方法
参考答案:D。当超类的实例方法或类方法为private时,是不能被子类调用的。同理,当其他类的实例方法被为private时,也不能直接调用。

11,下列关于构造方法的叙述中,错误的是() (p54)

A, Java语言规定构造方法名与类名必须相同
B, Java语言规定构造方法没有返回值,但不用void声明
C, Java语言规定构造方法不可以重载
D,Java语言规定构造方法只能通过new自动调用
参考答案:C。1)构造函数必须与类的名字相同,并且不能有返回值(返回值也不能为void)。所以,A,B√;2)构造函数不能被继承,因此,它不能被覆盖,但是构造函数能够被重载,可以使用不同的参数个数或参数类型来定义多个构造函数。所以,C,×;3)构造函数总是伴随着new操作一起调用,且不能由程序的编写者直接调用,必须要由系统调用。构造函数在对象实例化时会自动调用,且只运行一次;而普通方法是在程序执行它时被调用,且可以被该对象调用多次。所以,D,√。

12,下列说法中,正确的是() (p54)

A, class中的constructor不可省略
B, constructor必须与class同名,但方法不能与class同名
C, constructor在一个对象被new时执行
D,一个class只能定义一个constructor
参考答案:C。每个类可以有多个构造函数,所以d,错。其他选项参考上面解析。

13,不能用来修饰interface的有() (p56)

A, private
B, public
C, protected
D,static
参考答案:A、C、D。接口中成员的作用域修饰符都是public,接口中的常量值默认使用public static final 修饰。

14,Java创建对象的方式有几种? (p61)

答:共有4种创建对象的方法。
1) 通过new语句实例化一个对象
2) 通过反射机制创建对象
3) 通过clone()方法创建一个对象
4) 通过反序列化的方式创建对象

15,下列说法中,正确的是() (p62)

A, Java中包的主要作用是实现跨平台功能
B, Package语句只能放在import语句后面
C, 包(package)由一组类(class)和接口(interface)组成
D,可以用#include关键字来表明来自其他包中的类
参考答案:C。
1)package主要有以下两个作用:第一,提供多层命名空间,解决命名冲突,通过使用package,使得处于不同package中的类可以存在相同的名字。第二,对类功能进行分类,使项目的组织更加清晰。所以,A,×。
2)在每个源文件的开头加上“package packagename;”。所以,B,×。
3)#include是c或者c++中的。所以,D,×。

16,下列有关继承的说法中,正确的是() (p66)

A, 子类能继承父类的所有方法和状态
B, 子类能继承父类的非私有方法和状态
C, 子类只能继承父类public方法和状态
D,子类能继承父类的方法,而不是状态
参考答案: B。
继承主要特性:
1)Java语言不支持多重继承,也就是说,子类至多只能有一个父类,但是可以通过实现多个接口来达到多继承的目的。
2)子类只能继承父类的非私有(public和protected)成员变量与方法。所以,A,C,D,×;B,√。
3)当子类中定义的成员变量和父类中定义的成员变量同名时,子类中的成员变量会覆盖父类中的成员变量,而不会继承。
4)当子类中的方法与父类中的方法有相同的函数签名(相同的方法名、相同的参数个数与类型)时,子类将会覆盖父类的方法,而不会继承。

17,Java中提供了哪两种用于多态的机制? (p69)

答:编译时多态和运行时多态。编译时多态是通过方法的重载实现的,运行时多态是通过方法的覆盖(子类覆盖父类方法)实现的。

18,如下代码的运行结果是什么? (p69)

  1. class Super{
  2. publicint f() {
  3. return 1;
  4. }
  5. }
  6. public class SubClass extends Super{
  7. publicfloat f(){
  8. return 2f
  9. }
  10. public static void main(String[] args) {
  11. Supers=newSubClass ();
  12. System.out.println("Test main");
  13. }
  14. }

参考答案:编译时错误。因为函数是不能以返回值来区分的,虽然父类与子类中的函数有着不同的返回值,但是它们有着相同的函数名,因此,编译器无法区分。

19,下列关于接口的定义中,正确的是() (p70)

A, void methoda();
B, public double methoda();
C, public final double methoda();
D,static voidmethoda(double d1);
E, protected void methoda(double d1);
F, int a;
G, int b = 1;
参考答案:A、B、G。接口中的方法只能用关键字public和abstract来修饰,因此,C,D,E,×。接口中的属性默认都为public static final ,由于属性被final修饰,因此它是常量,常量在定义时就必须初始化,因此,F,×。

20,下列说法中正确的是() (p70)

A. 声明抽象方法大括号可有可无
B. 声明抽象方法不可写出大括号
C. 抽象方法有方法体
D.abstract可修饰属性、方法和类
参考答案:B。抽象方法不能有方法体,同理也就不能有大括号。所以,A,C,×。;abstract只能用来修饰类与方法,不能用来修饰属性,所以,D,×。

21,定义如下一个外部类。 (p72)

Publicclass OuterClass{
privateint d1 = 1;
//编写内部类
}
先需要在这个外部类中定义一个内部类,下面哪个定义是正确的?()
A, class InnerClass{
public static intmethoda(){
return d1;
}
}
B, class InnerClass{
static in tmethoda(){
return d1;
}
}
C, private class InnerClass{
int methoda(){
return d1;
}
}
D,static classInnerClass{
protected int methoda(){
return d1;
}
}
E, abstract class InnerClass{
public static int methoda();
}
参考答案:C、E。由于在非静态内部类中不能定义静态成员,因此,A,B,×;由于静态内部类不能访问外部类的非静态成员,因此,D,×。

22,下面程序的运行结果是什么? (p75)

  1. class Base{
  2. public Base(){
  3. System.out.println("Base");
  4. }
  5. }
  6. public class Sub extends Base{
  7. public Sub(){
  8. System.out.println("Subr");
  9. super();
  10. }
  11. }
  12. public class Test{
  13. public static void main(String[] args) {
  14. Base s = new Sub();
  15. }
  16. }

参考答案:编译错误。当子类构造函数需要显示调用父类构造函数时,super()必须为构造函数的第一条语句。

23,下列不属于Java标识符的是() (p76)

A,_HelloWorld
B, 3HelloWorld
C, $HelloWorld
D, HelloWorld3
参考答案: B。在Java语言中,变量名、函数名、数组统称为标识符,Java语言规定标识符只能由字母(a~z,A~Z)、数字(0~9)、下划线(—)和美元符号($)组成,且第一个字母不能是数字。

24,下列标识符不合法的有 (p76)

A, new
B, $usdollars
C, 1234
D,car.taxi
参考答案:A、C、D。解析见上。

25,程序运行结果为? (p77)

  1. public class Break{
  2. publicstatic void main(String[] args){
  3. out:
  4. for(int i = 0;i<5;i++){
  5. for(int j = 0 ; j<5 ; j++){
  6. if(j>=2)
  7. break out;
  8. System.out.println(j);
  9. }
  10. }
  11. System.out.println(“break”);
  12. }
  13. }

参考答案:
0
1
Break

26,引申:Java语言中是否存在goto关键字? (p77)

答:虽然关键字goto作为java的保留字,但目前并没有在Java中使用。在c/c++中,goto常被用于跳出多重循环,而在java语言中,可以使用break和continue来达到同样的效果。

27,JDK中哪些类是不能继承的? (p79)

答:不能继承的类是那些用final关键字修饰的类。一般比较基本的类型为防止扩展类无意间破坏原来方法的实现的类型都应该是final的,在jdk中,String、StringBuffer等都是基本类型,所以,String、StringBuffer等类是不能继承的。

引申1:什么是实例变量?什么是局部变量?什么是类变量?什么是final变量? (p83)

参考答案:
实例变量:变量归对象所有(只有在实例化对象后才可以)。每当实例化一个对象时,会创建一个副本并初始化,如果没有显示初始化,那么会初始化一个默认值。各个对象中的实例变量互不影响。
局部变量:在方法中定义的变量,在使用前必须初始化。
类变量:用static可修饰的属性、变量归类所有,只要类被加载,这个变量就可以被使用(类名.变量名)。所有实例化的对象共享类变量。
final变量:表示这个变量为常量,不能被修改。

引申2:static与final结合使用表示什么意思? (p83)

参考答案:在Java语言中,static关键字常与final关键字结合使用,用来修饰成员变量与成员方法,有点类似于c/c++语言中的“全局常量”。对于变量,若使用static final 修饰,则表示一旦赋值,就不可修改,并且通过类名可以访问;对于方法,若使用static final 修饰,则表示该方法不可覆盖,并且可以通过类名直接访问。

28,以下的运行结果是什么? (p83)

  1. public class Test{
  2. public static int testStatic() {
  3. static final int i= 0 ;
  4. System.out.println(i++);
  5. }
  6. public static void main(String[] args) {
  7. Test t = new Test();
  8. t.testStatic();
  9. }
  10. }

A,0; B,1; C,2; D,编译失败
参考答案:D。在java语言中,不能在成员函数内部定义static变量

29,下列程序运行结果为? (p88)

  1. public class Test{
  2. String s;
  3. int i;
  4. float f;
  5. public static void main(String args[]){
  6. Test t = new Test();
  7. System.out.println(t.s == null);
  8. System.out.println(t.i);
  9. System.out.println(t.f);
  10. }
  11. }

参考答案:
true
0
0.0

30,引申1:在Java语言中null值是什么?在内存中null是什么? (p88)

参考答案:null不是一个合法的Object实例,所以编译器并没有为其分配内存,它仅仅用于表明该引用目前没有指向任何对象。其实,与c语言类似,null是将引用变量的值全部置为0。

31,引申2:如何理解赋值语句String x = null? (p88)

参考答案:在Java语言中,变量被分为两大类型:原始值(primitive)与引用值(reference)。声明为原始类型的变量,其存储的是实际的值。声明为引用类型的变量,存储的是实际对象的地址(指针、引用)。对于赋值语句String x = null,它定义了一个变量“x”,x中存放的是String引用,此处为null。

32,下列表达式中,正确的是() (p88)

A, byte b=128;
B, Boolean flag = null;
C, float f =0.9239;
D,long a = 2147483648L;
参考答案:D。A,byte能表示的取值范围为[-128,127],因此不能表示128;B,Boolean的取值只能为true或者false,不能为null;C,0.9239为double类型,需要进行数据类型转换。

33,String是最基本的数据类型吗? (p88)

参考答案:不是。基本数据类型包括byte、int、char、long、float、double、boolean和short

34,int和ingteger有什么区别? (p88)

参考答案:Java语言提供两种不同的类型,即引用类型和原始类型(或内置类型)。Int是Java语言的原始数据类型,Integer是Java语言为int提供的封装类。Java为每个原始类型提供了封装类。
引用类型与原始类型的行为完全不同,并且它们具有不同的语义。而且,引用类型与原始类型具有不同的特征和用法。

35,赋值语句float f=3.4是否正确? (p88)

参考答案:不正确。数据3.4默认情况下是double类型,即双精度浮点数,将double类型数值赋值给float类型的变量,会造成精度损失,因此需要对其进行强制类型转换,即将3.4转换成float类型或者将3.4强制写出float类型。所以,float f = (float)3.4 或者float f=3.4F

36,下列说法中,正确的是()。 (p94)

A, call by value不会改变实际参数的值
B, call by reference能改变实际参数
C, call by reference不能改变实际参数的地址
D,call by reference能改变实际参数的内容
参考答案:A、C、D。
解析:Java语言提供了两种参数传递的方式:值传递和引用传递
1) 值传递:在方法调用中,实参会把它的值传递给形参,形参只是用实参的值初始化一个临时的存储单元,因此形参与实参虽然有相同的值,但是却有不同的存储单元,因此对形参的改变不影响实参的值。
2) 引用传递:在方法调用中,传递的是对象(也可以看作是对象的地址),这时形参与实参的对象指向同一块存储单元,因此对形参的修改就会影响实参的值。
(Java中,除了8种基本的数据类型用的是值传递,其他所有类型都用的是引用传递)

37,下列程序的运行结果是什么? (p95)

  1. int i = 1;
  2. if(i)
  3. System.out.println(“true”);
  4. else
  5. System.out.println(“false”)

参考答案:编译错误。因为if条件只接受boolean类型的值(true或false),而i的类型为int,int类型不能被隐式地转换成boolean类型。

39,对于下列代码结果强制类型转换后,变量a和b的值分别是 (p95)

shorta=128;
byteb = (byte)a;
参考答案:a = 128;b = -128。short类型变量占两个字节,a对应的二进制为:0000000010000000,由于byte只占一个字节,在强制转换为byte的时候只截取低字节:10000000,10000000是-128的补码,因此b的值为-128 。

40,下列程序的运行结果是什么? (p96)

  1. public class Test{
  2. public static void main(String[] args) {
  3. byte a = 5;
  4. int b = 10;
  5. int c = a>>2+b>>2;
  6. System.out.println(c);
  7. }
  8. }

参考答案:0 。由于“+”的优先级比“>>”高,因此程序中的表达式等价于a>>(2+b)>>2,相当于a>>12>>2,因此运行结果为0 。

41,Math.round(6.4)=? (p97)

Math.round(-6.4)=?
Math.ceil(6.4)=?
Math.ceil(-6.4)=?
Math.floor(6.4)=?
Math.floor(-6.4)=?
Math.round(11.5)等于多少?Math.round(-11.5)等于多少?
参考答案: 6; -6 ; 7.0 ; -6.0 ; 6.0 ; -7.0 ;12 , -11
解析:Math.round方法(环绕):先+0.5,再向下取整
Math.ceil方法(天花板):向上取整(若是正数,则直接“入”,若是负数,则直接“舍”)
Math.floor方法(地板):向下取整(若是正数,则直接“舍”,若是负数,则直接“入”)

42,(p98)

  1. public classTest{
  2. publicstatic void main(String[] a){
  3. int i = 1;
  4. System.out.println(i+++i++);
  5. System.out.println(“i=”+i);
  6. System.out.println(i+++++i);
  7. System.out.println(“i=”+i);
  8. System.out.println(i+++i+++i++);
  9. System.out.println(“i=”+i);
  10. }
  11. }

程序运行结果为:
3
i = 3
8
i = 5
18
i = 8

43,假设x=1,y=2,z=3,则表达式y+=z—/++x的值是() (p98)

A,3 B,3.5 C,4 D,5
参考答案:A。y=y+(z—/++x)即y=2+3/2=2+1=3。

44,在Java语言中,下列关于字符集编码(Character Set Encoding)和国际化(i18n)的叙述,哪些是正确的是() (p101)

A, 每个中文字符占用2Byte,每个英文字符占用1Byte
B, 假设数据库中的字符是以GBK编码的,那么显示数据库数据的网页也必须是GBK编码的
C, Java的char类型,以UTF-16Big Endian的方式保存一个字符
D,实现国际化应用常用的手段是利用ResourceBundle类
参考答案:A、D。1)在Java语言中,默认使用的Unicode编码方式,即每个字符占用两个字节。String存储为,英文占用一个字符,中文占用两个字符。所以,A,√,C,×。2)数据库与web页面可以有各自的编码,二者没有必然的关系。所以,B,错。3)ResourceBundle是一个资源处理类,可以经常在国际化应用中使用。所以,D,√。

45,new String(“abc”);创建了几个对象? (p103)

参考答案:一个或两个。如果常量池中原来有“abc”,那么只创建一个对象;如果常量池中原来没有字符串“abc”,那么就会创建两个对象。

46,假设有一下代码String s =“hello”;String t =“hello”;char c [] ={‘h’,’e’,’l’,’l’,’0’},下列选项中返回false语句的是() (p104)

A,s.equals(t); B,t.equals(c); C,s==t; D,t.equals(new String (“hello”));
参考答案: B。由于t与c分别为字符串类型和数组类型,因此返回值为false

47,下面程序的输出结果是什么? (p105)

Strings =“abc”;
String s1 =“ab”+“c”;
System.out.println(s==s1);
参考答案:true。“ab”+“c”在编译器就被转换为“abc”,存放在常量区,因此输出结果为true。

48,Set里的元素是不能重复的,那么用什么方法来区分是否重复呢?是用“==“还是equals()?它们有什么差别? (p105)

参考答案:用equals()方法来区分是否重复。

49,下列数组的定义中,哪3条是正确的?() (p109)

A, public int a []
B, static int[] a
C, public [] int a
D,private inta [3]
E, private int [3] a []
F, public final int [] a
参考答案:A、B、F。
解析:
一,在Java语言中声明一维数组的方式为:
1)type arrayName[]
2)type[] arrayName
注意:1)在Java语言中,数组被创建后会根据数组存放的数据类型初始化成对应的初始值(eg:int 类型会初始化为0、对象会初始化为null)。
2)Java数组在定义时,并不会给数组元素分配存储空间,因此[]中不需要指定数组的长度。
所以,A、B、√;C、D、×。
二,二维数组有三种声明方式:
1)typearrayName[][]
2) type[][] arrayName
3) type[]arrayName[]
注意:在声明二维数组时,[]必须为空
所以,F、√;E、×。

50,下列数组定义及赋值中,错误的是() (p109)

A, int intArray [] ;
B, intArray = new int [3]; intArray[1]=1; intArray[2]=2;intArray[3]=3;
C, int a[] ={1,2,3,4,5};
D,int[][] a = new int[2][]; a[0]=new int [3]; a[1]=newint [3];
参考答案:B。B中对数组的访问越界了。数组大小为3,第一个元素为intArray[0],最后一个元素为intArray[2]。

51,下列说法中错误的有() (p109)

A, 数组是一种对象
B, 数组属于一种原生类
C, int number[]={31,23,33,43,35,63}
D,数组的大小是可以任意改变
参考答案: B、D。原生类指未被实例化的类,数组一般指实例化、被分配空间的类,所以不属于原生类。B,×。数组是指具有相同类型的数据的集合,它们一般具有固定的长度,并且在内存中占据连续的空间。D,×。

52,下列语句中,创建了一个数组实例的是() (p109)

A, int [] ia = new int[5];
B, float [] fa = new float[20];
C, char [] ca = “Some String”;
D,int[][] ia ={4,5,6} {1,2,3};
参考答案:A。

53,下面程序的运行结果是什么? (p113)

  1. public class Foo {
  2. public static void main(String[] args) {
  3. try {
  4. return;
  5. } finally {
  6. System.out.println("Finally");
  7. }
  8. }
  9. }

A, Finally;B,编译失败;C,代码正常运行但没有任何输出;D,运行时抛出异常
参考答案:A。在Java中,finally块的作用就是为了保证无论出现什么情况,finally块里的代码一定会被执行。由于程序执行return就意味着结束对当前函数的调用并跳出这个函数体,因此任何语句要执行都只能在return前执行(除非碰到exit函数),因此finally块里的代码也是在return前执行的。此外,如果try-finally或者catch-finally中都有return,那么finally块中的return语句会覆盖别处的return语句,最终返回到调用者那里的是finally中的return的值。

54,下列异常中,能使用throw抛出的是() (p114)

A, Error
B, Event
C, Object
D,Throwable
E, Exception
F, RuntimeException
参考答案:A、D、E、F。 其中Throwable为异常处理的基类,Error、Exception、RuntimeException都是Throwable的子类,因此都能使用throw抛出。

55,下面程序能否编译通过?如果把ArithmeticException换成IOException呢? (p115)

  1. public class ExceptionTypeTest{
  2. public void doSomething() throws ArithmeticException{
  3. System.out.println();
  4. }
  5. public static void main(String[] args) {
  6. ExceptionTypeTestett = new ExceptionTypeTest();
  7. ett.doSomething();
  8. }
  9. }

答:能。ArithmeticException属于运行时异常,编译器没有强制对其进行捕获并处理,因此编译可以通过。但是如果换成IOException后,由于IOException属于检查异常,编译器强制去捕获此类型的异常,因此如果不对异常进行捕获将会有编译错误。

56,异常包含下列哪些内容?() (p115)

A, 程序中的语法错误
B, 程序的编译错误
C, 程序执行过程中遇到的没有预料到的情况
D,程序事先定义好的可能出现的意外情况
参考答案: C。异常是指程序运行时(非编译时)所发生的非正常情况或错误,当程序违反了语义规则时,JVM就会将出现的错误表示为一个异常并抛出。

57,下面关于异常的说法,正确的是() (p116)

A, 一旦出现异常,程序运行就终止了
B, 如果一个方法申明将抛出某个异常,它就必须真的抛出那个异常
C, 在catch子句中匹配异常是一种精神匹配
D,可能抛出系统异常的方法是不需要申明异常的
参考答案:D。

58,Java中有几种类型的流? (p117)

答:常见的流有两种,分别为字节流与字符流。其中,字节流继承于InputStream与OutputStream,字符流继承于Reader与Writer。在java.io包中还有其他的流,流的作用主要是为了改善程序性能并且使用方便

59,用Socket实现客户端和服务器端的通信,要求客户发送数据后能够回显相同的数据。(P120)

答:首先,创建一个名为Server.java的服务端代码,如下所示。

其次,创建一个Client.java的客户端程序,如下所示。

最后启动服务器端程序,然后运行客户端程序,客户端将会把从服务器端转发过来的“Hello“打印出来。

60,(p124)

  1. import java.io.Serializable;
  2. public class DataObject implements Serializable {
  3. private static int i = 0;
  4. private String word = "";
  5. public static void setI(int i) {
  6. DataObject.i = i;
  7. }
  8. public void setWord(String word) {
  9. this.word = word;
  10. }
  11. }

A,“ “,0;B,” “,2;C,”123“,2;D,”123“,0
参考答案:D。Java在序列化时不会实例化static变量,因此上述代码只实例化了word,而没有实例化i。在反序列化时只能读取到word的值,i为默认值。

61,一个Java程序运行从上到下的环境次序是() (p125)

A, 操作系统、Java程序、JRE/JVM、硬件
B, JRE/JVM、Java程序、硬件、操作系统
C, Java程序、JRE/JVM、操作系统、硬件
D,Java程序、操作系统、JRE/JVM、硬件
参考答案:C。

62,下列说法中,正确的是() (p126)

A, Java程序经编译后会产生机器码
B, Java程序经编译后会产生字节码
C, Java程序经编译后产生DLL
D,以上都不正确
参考答案:B。.java文件被javac指令编译为.class后缀的字节码文件,再由JVM执行。

63,现有如下代码。 (p129)

1 public Object m(){
2 Objecto = new Float(3.14F);
3 Object[] oa = new Object[1];
4 oa[0]= o;
5 o= null;
6 oa[0]=null;
7 print‘return 0’;
8 }
当Float对象在第2行被创建后,什么时候能够被垃圾回收?()
A,4行以后 B,5行以后 C,6行以后 D,7行以后
参考答案:C。在第6行后不再有对象引用Float对象了,因此能够被垃圾回收。

64,下列关于垃圾回收的说法中,正确的是() (p129)

A, 一旦一个对象成为垃圾,就立刻被回收掉
B, 对象空间被回收掉之后,会执行该对象的finalize方法
C, Finalize方法和c++的析构函数完全是一回事情
D,一个对象成为垃圾是因为不再有引用指着它,但是线程并非如此
参考答案:D。成为垃圾的对象,只有在下次垃圾回收器运行时才会被回收,而不是马上被清理,因此A错误。finalize方法是在对象空间被回收前调用的,因此选项B错误。在c++语言中,调用了析构函数后,对象一定会被销毁,而Java语言调用了finalize方法,垃圾却不一定会被回收,因此finalize与c++的析构函数是不同的,所以C不正确。对于D,当一个对象不再被引用后就成为垃圾可以被回收,但是线程就算没有被引用也可以独立运行的,因此与对象不同。所以D正确。

65,是否可以主动通知jvm进行垃圾回收?(p129)

参考答案:由于垃圾回收器的存在,Java语言本身没有给开发人员提供显式释放已分配内存的方法,也就是说,开发人员不能实时地调用垃圾回收器对某个对象或所有对象进行垃圾回收。但开发人员可以通过调用System.gc()方法来“通知”垃圾回收器运行,当然,jvm也并不会保证垃圾回收器马上就会运行。由于System.gc()方法的执行会停止所有响应,去检查内存中是否有可回收的对象,这会对程序的正常运行以及性能造成极大的威胁,因此实际编程时,不推荐频繁使用这一方法。

66,下面哪种创建Map集合的方式是正确的?() (p133)

A, Map m = new Map()
B, Map m = new Map(int capacity , increment capacity)
C, Map m = new Map(new Collection)
D,Map是接口,所以不能实例化
参考答案:D。由于Map是一个接口,因此不能直接实例化Map的对象,但是可以实例化实现Map接口的类的对象,例如Map m = new HashMap()。

67, (p134)

  1. import java.util.Iterator;
  2. import java.util.LinkedList;
  3. import java.util.List;
  4. public class IteratorTest {
  5. public static void main(String[] args) {
  6. List<String> ll = new LinkedList<String>();
  7. ll.add("first");
  8. ll.add("second");
  9. ll.add("third");
  10. ll.add("fourth");
  11. for (Iterator<String> iter = ll.iterator(); iter.hasNext();) {
  12. String str = (String) iter.next();
  13. System.out.println(str);
  14. }
  15. }
  16. }

答:程序运行结果为:
first
second
third
fourth

68,Iterator与ListIterator有什么区别? (p135)

参考答案:Iterator只能正向遍历集合,适用于获取移除元素。ListIterator继承自Iterator,专门针对List,可以从两个方向来遍历List,同时支持元素的修改。

69,若线性表最常用的操作是存取第i个元素及其前驱的值,则采用()存储方式节省时间。 (p136)

A, 单链表
B, 双链表
C, 单循环链表
D,顺序表
参考答案:D。顺序适合在随机访问的场合使用,访问时间复杂度为O(1),而列表的随机访问操作的时间复杂度为O(n)。

70,对于importjava.util包,下列说法错误的是() (p136)

A, Vector类属于java.util包
B, Vector类放在…/java/util目录下
C, Vector类放在java.util文件中
D,Vector类是Sun公司的产品
参考答案:C。java.util是包名,实质上是一个目录结构。

71,在Hashtable上下文中,同步指的是什么?(p137)

答:同步意味着在一个时间点只能有一个线程可以修改hash表,任何线程在执行Hashtable的更新操作前都需要获取对象锁,其他线程则等待锁的释放。

72,如何实现HashMap的同步?(p137)

答:HashMap可以通过Map m = Collections.synchronizedMap(new HashMap())来达到同步的效果。具体而言,该方法返回一个同步的Map,该Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。
补:使用Collections的示例如下,写出运行结果(p142)

  1. import java.util.*;
  2. public class TestCollection {
  3. public static void main(String args[]) {
  4. List<Integer> list = new LinkedList<Integer>();
  5. int array[] = { 1, 7, 3, 2 };
  6. for (int i = 0; i < array.length; i++) {
  7. list.add(new Integer(array[i]));
  8. }
  9. Collections.sort(list);
  10. for (int i = 0; i < array.length; i++) {
  11. System.out.println(list.get(i));
  12. }
  13. }
  14. }

参考答案:
1
2
3
7

73,一个类是否可以同时继承Thread与实现Runnable接口?(p146)

答:可以。

74,利用Thread.wait()同步线程,可以设置超时时间吗?(p150)

答:可以。可以设置超时,函数原型为wait(long timeout)和wait(longtimeout,int nanos)timeout代表最长的等待时间,单位为ms;nanos代表额外的等待时间,单位为ns。

75,在一个线程中sleep(1000)方法,使该线程在多长时间后获得对cpu的控制(假设睡眠过程中不会有其他事件唤醒该线程)?(p150)

A, 正好1000ms
B, <1000ms
C, >=1000ms
D,不一定
参考答案:C。sleep()方法制定的时间为线程不会运行的最短时间。当睡眠时间结束后,线程会返回到可运行状态,不是运行状态,还需要等待cpu调度执行。因此,sleep()方法不能保证该线程睡眠到期后就开始执行。

76,当一个线程进入一个对象的synchronized()方法后,其他线程是否可进入此对象的其他方法? (p154)

参考答案:取决于方法本身,如果该方法是非synchronized()方法,那么是可以访问的;
如果其他方法是静态方法(使用static修饰的方法),它用的同步锁是当前类的字节码,与非静态的方法不能同步(因为非静态的方法用的是this),因此,静态方法可以被调用。
如果这个方法内部调用了wait()方法,那么其他线程就可以访问同一对象的其他synchronized()方法。如果这个方法内部没有调用wait()方法,并且其他方法都为synchronized()方法,那么其他线程将无法访问这个对象的其他方法。

77,Java的Daemon线程(守护线程),setDaemon设置必须要()。 (p157)

A, 在调用start()方法之前
B, 调用在start()方法之后
C, 前后都可以
参考答案:A。

78,关于守护线程的说法,正确的是()。 (p157)

A, 所有非守护线程终止,即使存在守护线程,进程运行终止
B, 所有守护线程终止,即使存在非守护线程,进程运行终止
C, 只要有守护线程或者非守护线程进程其中之一存在,进程就不会终止
D,只要所有守护线程和非守护线程终止运行之后,进程才会终止
参考答案:A

79,举出一个用JDBC访问MySQL的例子(p159)

答:首先,创建一个Employee表。

  1. create table Employee(
  2. id int primary key,
  3. name varchar(20),
  4. age int
  5. );

其次,创建一个示例程序,如下所示。

80,JDBC的主要功能有() (p160)

A, 创建与数据库的连接
B, 发送SQL语句到数据库中
C, 处理数据并查询结果
D,以上都是
参考答案:D

81,提供Java存取数据库能力的包是() (p160)

A, java.sql
B, java.awt
C, java.lang
D,java.swing
参考答案:A。对数据库操作的所有类都在java.sql包中。

82,用于调用存储过程的对象是() (p163)

A, ResultSet
B, DriverManager
C, CallableStatemet
D,PreparedStatement
参考答案:C。JDBC中CallableStatement对象为所有RDBMS(Relational DatabaseManagement System,关系数据库管理系统)提供了一种标准形式调用存储过程的方法。其对存储过程的调用存在两种形式:带结果参数和不带结果参数。结果参数是一种输出参数,是存储过程的返回值。两种形式都可带有数量可变的输入(IN参数)、输出(OUT参数)或输入输出(IN-OUT参数)的参数。

整理自Java程序员面试笔试宝典一书,具体可查看我的原文博客:
Java程序员