资源描述
1. 下面哪些是Thread类的措施()
A start() B run() C exit() D getPriority()
答案:ABD
解析:看Java API docs吧:,exit()是System类的措施,如System.exit(0)。
2. 下面有关java.lang.Exception类的说法正确的是()
A 继承自Throwable B Serialable CD 不记得,反正不正确
答案:A
解析:Java异常的基类为java.lang.Throwable,java.lang.Error和java.lang.Exception继承 Throwable,RuntimeException和其他的Exception等继承Exception,详细的RuntimeException继承RuntimeException。
扩展:错误和异常的区分(Error vs Exception)
1) java.lang.Error: Throwable的子类,用于标识严重错误。合理的应用程序不应当去try/catch这种错误。绝大多数的错误都是非正常的,就根本不该出现的。
java.lang.Exception: Throwable的子类,用于指示一个合理的程序想去catch的条件。即它仅仅是一个程序运行条件,而非严重错误,并且激励用户程序去catch它。
2) Error和RuntimeException 及其子类都是未检查的异常(unchecked exceptions),而所有其他的Exception类都是检查了的异常(checked exceptions).
checked exceptions: 一般是从一个能够恢复的程序中抛出来的,并且最佳能够从这种异常中使用程序恢复。例如FileNotFoundException, ParseException等。检查了的异常发生在编译阶段,必须要使用try…catch(或者throws)否则编译不通过。
unchecked exceptions: 一般是假如一切正常的话本不该发生的异常,不过确实发生了。发生在运行期,具备不确定性,重要是因为程序的逻辑问题所引起的。例如ArrayIndexOutOfBoundException, ClassCastException等。从语言自身的角度讲,程序不该去catch此类异常,虽然能够从诸如RuntimeException这么的异常中catch并恢复,不过并不激励终端程序员这么做,因为完全没要必要。因为此类错误自身就是bug,应当被修复,出现此类错误时程序就应当立即停止执行。 因此,面对Errors和unchecked exceptions应当让程序自动终止执行,程序员不该做诸如try/catch这么的事情,而是应当查明原因,修改代码逻辑。
RuntimeException:RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等。
处理RuntimeException的标准是:假如出现 RuntimeException,那么一定是程序员的错误。例如,能够通过检查数组下标和数组边界来防止数组越界访问异常。其他(IOException等等)checked异常一般是外部错误,例如试图从文献尾后读取数据等,这并不是程序自身的错误,而是在应用环境中出现的外部错误。
3. 下面程序的运行成果是()
String str1 = "hello";
String str2 = "he" + new String("llo");
System.err.println(str1 == str2);
答案:false
解析:因为str2中的llo是新申请的内存块,而==判断的是对象的地址而非值,因此不一样样。假如是String str2 = str1,那么就是true了。
4. 下列说法正确的有()
A. class中的constructor不可省略
B. constructor必须与class同名,但措施不能与class同名
C. constructor在一个对象被new时执行
D.一个class只能定义一个constructor
答案:C
解析:这里也许会有误区,其实一般的类措施是能够和类名同名的,和结构措施唯一的辨别就是,结构措施没有返回值。
5. 详细选项不记得,但用到的知识如下:
String []a = new String[10];
则:a[0]~a[9] = null
a.length = 10
假如是int []a = new int[10];
则:a[0]~a[9] = 0
a.length = 10
6. 下面程序的运行成果:()
public static void main(String args[]) {
Thread t = new Thread() {
public void run() {
pong();
}
};
t.run();
System.out.print("ping");
}
static void pong() {
System.out.print("pong");
}
A pingpong B pongping C pingpong和pongping都有也许 D 都不输出
答案:B
解析:这里考的是Thread类中start()和run()措施的区分了。start()用来开启一个线程,当调用start措施后,系统才会开启一个新的线程,进而调用run()措施来执行任务,而单独的调用run()就跟调用一般措施是同样的,已经失去线程的特性了。因此在开启一个线程的时候一定要使用start()而不是run()。
7. 下列属于关系型数据库的是()
A. Oracle B MySql C IMS D MongoDB
答案:AB
解答:IMS(Information Management System )数据库是IBM企业开发的两种数据库类型之一;
一个是关系数据库,经典代表产品:DB2;
另一个则是层次数据库,代表产品:IMS层次数据库。
非关系型数据库有MongoDB、memcachedb、Redis等。
8. GC线程是否为守护线程?()
答案:是
解析:线程分为守护线程和非守护线程(即用户线程)。
只要目前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就所有工作;只有当最后一个非守护线程结束时,守护线程伴随JVM一同结束工作。
守护线程最经典的应用就是 GC (垃圾回收器)
9. volatile核心字是否能确保线程安全?()
答案:不能
解析:volatile核心字用在多线程同时中,可确保读取的可见性,JVM只是确保从主内存加载到线程工作内存的值是最新的读取值,而非cache中。但多个线程对
volatile的写操作,无法确保线程安全。例如假如线程1,线程2 在进行read,load 操作中,发觉主内存中count的值都是5,那么都会加载这个最新的值,在线程1堆count进行修改之后,会write到主内存中,主内存中的count变量就会变为6;线程2因为已经进行read,load操作,在进行运算之后,也会更新主内存count的变量值为6;导致两个线程及时用volatile核心字修改之后,还是会存在并发的情况。
10. 下列说法正确的是()
A LinkedList继承自List
B AbstractSet继承自Set
C HashSet继承自AbstractSet
D WeakMap继承自HashMap
答案:AC
解析:下面是一张下载的Java中的集合类型的继承关系图,一目了然。
11. 存在使i + 1 < i的数吗()
答案:存在
解析:假如i为int型,那么当i为int能表示的最大整数时,i+1就溢出变成负数了,此时不就<i了吗。
扩展:存在使i > j || i <= j不成立的数吗()
答案:存在
解析:例如Double.NaN或Float.NaN,感激@BuilderQiu网友指出。
12. 0.6332的数据类型是()
A float B double C Float D Double
答案:B
解析:默以为double型,假如为float型需要加上f显示阐明,即0.6332f
13. 下面哪个流类属于面对字符的输入流( )
A BufferedWriter B FileInputStream C ObjectInputStream D InputStreamReader
答案:D
解析:Java的IO操作中有面对字节(Byte)和面对字符(Character)两种方式。
面对字节的操作为以8位为单位对二进制的数据进行操作,对数据不进行转换,这些类都是InputStream和OutputStream的子类。
面对字符的操作为以字符为单位对数据进行操作,在读的时候将二进制数据转为字符,在写的时候将字符转为二进制数据,这些类都是Reader和Writer的子类。
总结:以InputStream(输入)/OutputStream(输出)为后缀的是字节流;
以Reader(输入)/Writer(输出)为后缀的是字符流。
扩展:Java流类图结构,一目了然,处理大部分选择题:
14. Java接口的修饰符能够为()
A private B protected C final D abstract
答案:CD
解析:接口很重要,为了阐明情况,这里稍微烦琐点:
(1)接口用于描述系统对外提供的所有服务,因此接口中的组员常量和措施都必须是公开(public)类型的,确保外部使用者能访问它们;
(2)接口仅仅描述系统能做什么,但不指明怎样去做,因此接口中的措施都是抽象(abstract)措施;
(3)接口不包括和任何详细实例有关的细节,因此接口没有结构措施,不能被实例化,没有实例变量,只有静态(static)变量;
(4)接口的中的变量是所有实现类共有的,既然共有,肯定是不变的东西,因为变化的东西也不能够算共有。因此变量是不可变(final)类型,也就是常量了。
(5) 接口中不能够定义变量?假如接口能够定义变量,不过接口中的措施又都是抽象的,在接口中无法通过行为来修改属性。有的人会说了,没有关系,能够通过 实现接口的对象的行为来修改接口中的属性。这当然没有问题,不过考虑这么的情况。假如接口 A 中有一个public 访问权限的静态变量 a。按照 Java 的语义,我们能够不通过实现接口的对象来访问变量 a,通过 A.a = xxx; 就能够变化接口中的变量 a 的值了。正如抽象类中是能够这么做的,那么实现接口 A 的所有对象也都会自动拥有这一变化后的 a 的值了,也就是说一个地方变化了 a,所有这些对象中 a 的值也都跟着变了。这和抽象类有什么区分呢,怎么体现接口更高的抽象级别呢,怎么体现接口提供的统一的协议呢,那还要接口这种抽象来做什么呢?因此接口中 不能出现变量,假如有变量,就和接口提供的统一的抽象这种思想是抵触的。因此接口中的属性必然是常量,只能读不能改,这么才能为实现接口的对象提供一个统 一的属性。
通俗的讲,你以为是要变化的东西,就放在你自己的实现中,不能放在接口中去,接口只是对一类事物的属性和行为更高层次的抽象。对修改关闭,对扩展(不一样的实现 implements)开放,接口是对开闭标准的一个体现。
因此:
接口的措施默认是public abstract;
接口中不能够定义变量即只能定义常量(加上final修饰就会变成常量)。因此接口的属性默认是public static final 常量,且必须赋初值。
注意:final和abstract不能同时出现。
15. 不通过结构函数也能创建对象吗()
A 是 B 否
答案:A
解析:Java创建对象的几个方式(重要):
(1) 用new语句创建对象,这是最常见的创建对象的措施。
(2) 利用反射伎俩,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例措施。
(3) 调用对象的clone()措施。
(4) 利用反序列化伎俩,调用java.io.ObjectInputStream对象的 readObject()措施。
(1)和(2)都会明确的显式的调用结构函数 ;(3)是在内存上对已经有对象的影印,因此不会调用结构函数 ;(4)是从文献中还原类的对象,也不会调用结构函数。
16. ArrayList list = new ArrayList(20);中的list扩充几次()
A 0 B 1 C 2 D 3
答案:A
解析:这里有点困惑人,大家都懂得默认ArrayList的长度是10个,因此假如你要往list里添加20个元素肯定要扩充一次(扩充为本来的1.5倍),不过这里显示指明了需要多少空间,因此就一次性为你分派这么多空间,也就是不需要扩充了。
17. 下面哪些是对称加密算法()
A DES B AES C DSA D RSA
答案:AB
解析:常用的对称加密算法有:DES、3DES、RC2、RC4、AES
常用的非对称加密算法有:RSA、DSA、ECC
使用单向散列函数的加密算法:MD5、SHA
18.新建一个流对象,下面哪个选项的代码是错误的?()
A)new BufferedWriter(new FileWriter("a.txt"));
B)new BufferedReader(new FileInputStream("a.dat"));
C)new GZIPOutputStream(new FileOutputStream("a.zip"));
D)new ObjectInputStream(new FileInputStream("a.dat"));
答案:B
解析:请记得13题的那个图吗?Reader只能用FileReader进行实例化。
19. 下面程序能正常运行吗()
public class NULL {
public static void haha(){
System.out.println("haha");
}
public static void main(String[] args) {
((NULL)null).haha();
}
}
答案:能正常运行
解析:输出为haha,因为null值能够强制转换为任何java类类型,(String)null也是合法的。但null强制转换后是无效对象,其返回值还是为null,而static措施的调用是和类名绑定的,不借助对象进行访问因此能正确输出。反过来,没有static修饰就只能用对象进行访问,使用null调用对象肯定会报空指针错了。这里和C++很类似。这里感激@Florian网友解答。
20. 下面程序的运行成果是什么()
class HelloA {
public HelloA() {
System.out.println("HelloA");
}
{ System.out.println("I'm A class"); }
static { System.out.println("static A"); }
}
public class HelloB extends HelloA {
public HelloB() {
System.out.println("HelloB");
}
{ System.out.println("I'm B class"); }
static { System.out.println("static B"); }
public static void main(String[] args) {
new HelloB();
}
}
答案:
static A
static B
I'm A class
HelloA
I'm B class
HelloB
解析:说实话我以为这题很好,考查静态语句块、结构语句块(就是只有大括号的那块)以及结构函数的执行次序。
对象的初始化次序:(1)类加载之后,按从上到下(从父类到子类)执行被static修饰的语句;(2)当static语句执行完之后,再执行main措施;(3)假如有语句new了自身的对象,将从上到下执行结构代码块、结构器(二者能够说绑定在一起)。
下面稍微修改下上面的代码,以便更清楚的阐明情况:
View Code
此时输出成果为:
static A
static B
-------main start-------
I'm A class
HelloA
I'm B class
HelloB
I'm A class
HelloA
I'm B class
HelloB
-------main end-------
21. getCustomerInfo()措施如下,try中能够捕捉三种类型的异常,假如在该措施运行中产生了一个IOException,将会输出什么成果()
public void getCustomerInfo() {
try {
// do something that may cause an Exception
} catch (java.io.FileNotFoundException ex) {
System.out.print("FileNotFoundException!");
} catch (java.io.IOException ex) {
System.out.print("IOException!");
} catch (java.lang.Exception ex) {
System.out.print("Exception!");
}
}
A IOException!
BIOException!Exception!
CFileNotFoundException!IOException!
DFileNotFoundException!IOException!Exception!
答案:A
解析:考查多个catch语句块的执行次序。当用多个catch语句时,catch语句块在次序上有先后之分。从最前面的catch语句块依次先后进行异常类型匹配,这么假如父异常在子异常类之前,那么首先匹配的将是父异常类,子异常类将不会取得匹配的机会,也即子异常类型所在的catch语句块将是不可抵达的语句。因此,一般将父类异常类即Exception老大放在catch语句块的最后一个。
22. 下面代码的运行成果为:()
import java.io.*;
import java.util.*;
public class foo{
public static void main (String[] args){
String s;
System.out.println("s=" + s);
}
}
A 代码得到编译,并输出“s=”
B 代码得到编译,并输出“s=null”
C 因为String s没有初始化,代码不能编译通过
D 代码得到编译,但捕捉到 NullPointException异常
答案:C
解析:开始以为会输出null什么的,运行后才发觉Java中所有定义的基本类型或对象都必须初始化才能输出值。
23. System.out.println("5" + 2);的输出成果应当是()。
A 52 B7 C2 D5
答案:A
解析:没啥好说的,Java会自动将2转换为字符串。
24. 指出下列程序运行的成果 ()
public class Example {
String str = new String("good");
char[] ch = { 'a', 'b', 'c' };
public static void main(String args[]) {
Example ex = new Example();
ex.change(ex.str, ex.ch);
System.out.print(ex.str + " and ");
System.out.print(ex.ch);
}
public void change(String str, char ch[]) {
str = "test ok";
ch[0] = 'g';
}
}
A、 good and abc
B、 good and gbc
C、 test ok and abc
D、 test ok and gbc
答案:B
解析:大家也许以为Java中String和数组都是对象因此肯定是对象引用,然后就会选D,其实这是个很大的误区:因为在java里没有引用传递,只有值传递
这个值指的是实参的地址的拷贝,得到这个拷贝地址后,你能够通过它修改这个地址的内容(引用不变),因为此时这个内容的地址和原地址是同一地址,
不过你不能变化这个地址自身使其重新引用其他的对象,也就是值传递,也许说的不是很清楚,下面给出一个完整的能阐明情况的例子吧:
View Code
程序有些烦琐,但能反应问题,该程序运行成果为:
对象互换前:p1 = Alexia female
对象互换前:p2 = Edward male
对象互换后:p1 = Alexia female
对象互换后:p2 = Edward male
对象数组互换前:arraya[0] = Alexia female, arraya[1] = Edward male
对象数组互换前:arrayb[0] = jmwang female, arrayb[1] = hwu male
对象数组互换后:arraya[0] = Alexia female, arraya[1] = Edward male
对象数组互换后:arrayb[0] = jmwang female, arrayb[1] = hwu male
基本类型数组互换前:a[0] = 0, a[1] = 1
基本类型数组互换前:b[0] = 1, b[1] = 2
基本类型数组互换后:a[0] = 0, a[1] = 1
基本类型数组互换后:b[0] = 1, b[1] = 2
对象数组内容互换并变化后:arraya[1] = wjl male
对象数组内容互换并变化后:arrayb[1] = Edward male
基本类型数组内容互换并变化后:a[1] = 5
基本类型数组内容互换并变化后:b[1] = 1
阐明:无论是对象、基本类型还是对象数组、基本类型数组,在函数中都不能变化其实际地址但能变化其中的内容。
25. 要从文献"file.dat"中读出第10个字节到变量c中,下列哪个措施适合? ()
A FileInputStream in=new FileInputStream("file.dat"); in.skip(9); int c=in.read();
B FileInputStream in=new FileInputStream("file.dat"); in.skip(10); int c=in.read();
C FileInputStream in=new FileInputStream("file.dat"); int c=in.read();
D RandomAccessFile in=new RandomAccessFile("file.dat"); in.skip(9); int c=in.readByte();
答案:A?D?
解析:long skip(long n)作用是跳过n个字节不读,重要用在包装流中的,因为一般流(如FileInputStream)只能次序一个一个的读不能跳跃读,不过包装流能够用skip措施跳跃读取。那么什么是包装流呢?各种字节节点流类,它们都只具备读写字节内容的措施,以FileInputStream与FileOutputStream为例,它们只能在文献中读取或者向文献中写入字节,在实际应用中我们往往需要在文献中读取或者写入各种类型的数据,就必须先将其他类型的数据转换成字节数组后写入文献,或者从文献中读取到的字节数组转换成其他数据类型,想想都很麻烦!!因此想通过FileOutputStream将一个浮点小数写入到文献中或将一个整数写入到文献时是非常困难的。这时就需要包装类DataInputStream/DataOutputStream,它提供了往各种输入输出流对象中读入或写入各种类型的数据的措施。
DataInputStream/DataOutputStream并没有对应到任何详细的流设备,一定要给它传递一个对应详细流设备的输入或输出流对象,完成类似 DataInputStream/DataOutputStream功效的类就是一个包装类,也叫过滤流类或处理流类。它对InputOutStream/OutputStream流类进行了包装,使编程人员使用起来更以便。其中DataInputStream包装类的结构函数语法:public DataInputStream(InputStream in)。包装类也能够包装另外一个包装类。
首先BC肯定 是错的,那A正确吗?按上面的解析应当也不对,但我试了下,发觉A也是正确的,与网上解析的资料有些出入,下面是我的code:
View Code
那么D呢,RandomAccessFile是IO包的类,不过其自成一派,从Object直接继承而来。能够对文献进行读取和写入。支持文献的随机访问,即能够随机读取文献中的某个位置内容,这么说RandomAccessFile肯定能够达成题目标要求,不过选项有些错误,例如RandomAccessFile的初始化是两个参数而非一个参数,采取的跳跃读取措施是skipBytes()而非skip(),即正确的写法是:
RandomAccessFile in = new RandomAccessFile("file.dat", "r");
in.skipBytes(9);
int c = in.readByte();
这么也能读到第十个字节,也就是A和D都能读到第十个字节,那么到底该选哪个呢?A和D有啥不一样吗?求大神解答~~~
26. 下列哪种异常是检查型异常,需要在编写程序时申明 ()
ANullPointerException BClassCastException CFileNotFoundException D IndexOutOfBoundsException
答案:C
解析:看第2题的解析。
27. 下面的措施,当输入为2的时候返回值是多少?()
public static int getValue(int i) {
int result = 0;
switch (i) {
case 1:
result = result + i;
case 2:
result = result + i * 2;
case 3:
result = result + i * 3;
}
return result;
}
A0 B2 C4 D10
答案:D
解析:注意这里case背面没有加break,因此从case 2开始一直往下运行。
28. 选项中哪一行代码能够替代题目中//add code here而不产生编译错误?()
public abstract class MyClass {
public int constInt = 5;
//add code here
public void method() {
}
}
Apublic abstract void method(int a);
B constInt = constInt + 5;
C public int method();
D public abstract void anotherMethod() {}
答案:A
解析:考查抽象类的使用。
抽象类遵照的标准:
(1)abstract核心字只能修饰类和措施,不能修饰字段。
(2)抽象类不能被实例化(无法使用new核心字创建对象实例),只能被继承。
(3)抽象类能够包括属性,措施,结构措施,初始化块,内部类,枚举类,和一般类同样,一般措施一定要实现,变量能够初始化或不初始化但不能初始化后在抽象类中重新赋值或操作该变量(只能在子类中变化该变量)。
(4)抽象类中的抽象措施(加了abstract核心字的措施)不能实现。
(5)含有抽象措施的类必须定义成抽象类。
扩展:抽象类和接口的区分,做个总结吧:
(1)接口是公开的,里面不能有私有的措施或变量,是用于让他人使用的,而抽象类是能够有私有措施或私有变量的。
(2)abstract class 在 Java 语言中表示的是一个继承关系,一个类只能使用一次继承关系。不过,一个类却能够实现多个interface,实现多重继承。接口尚有标识(里面没有任何措施,如Remote接口)和数据共享(里面的变量全是常量)的作用。
(3)在abstract class 中能够有自己的数据组员,也能够有非abstarct的组员措施,而在interface中,只能够有静态的不能被修改的数据组员(也就是必须是 static final的,不过在 interface中一般不定义数据组员),所有的组员措施默认都是 public abstract 类型的。
(4)abstract class和interface所反应出的设计理念不一样。其实abstract class表示的是"is-a"关系,interface表示的是"has-a"关系。
(5)实现接口的一定要实现接口里定义的所有措施,而实现抽象类能够有选择地重写需要用到的措施,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到详细类实现。抽象类中能够有非抽象措施。接口中则不能有实现措施。
(6)接口中定义的变量默认是public static final 型,且必须给其初值,因此实现类中不能重新定义,也不能变化其值。抽象类中的变量默认是 friendly 型,其值能够在子类中重新定义,也能够在子类中重新赋值。
29. 阅读Shape和Circle两个类的定义。在序列化一个Circle的对象circle到文献时,下面哪个字段会被保存到文献中? ( )
class Shape {
public String name;
}
class Circle extends Shape implements Serializable{
private float radius;
transient int color;
public static String type = "Circle";
}
Aname
B radius
C color
D type
答案:B
解析:这里有详细的解释:
30.下面是People和Child类的定义和结构措施,每个结构措施都输出编号。在执行new Child("mike")的时候都有哪些结构措施被次序调用?请选择输出成果 ( )
class People {
String name;
public People() {
System.out.print(1);
}
public People(String name) {
System.out.print(2);
this.name = name;
}
}
class Child extends People {
People father;
public Child(String name) {
System.out.print(3);
this.name = name;
father = new People(name + ":F");
}
public Child() {
System.out.print(4);
}
}
A312 B 32 C 432 D 132
答案:D
解析:考查的又是父类与子类的结构函数调用次序。在Java中,子类的结构过程中必须调用其父类的结构函数,是因为有继承关系存在时,子类要把父类的内容继承下来。但假如父类有多个结构函数时,该怎样选择调用呢?
第一个规则:子类的结构过程中,必须调用其父类的结构措施。一个类,假如我们不写结构措施,那么编译器会帮我们加上一个默认的结构措施(就是没有参数的结构措施),不过假如你自己写了
展开阅读全文