笔试题解惑系列(二) – Java功底型

这是一份非常不错的笔试题,它主要考察的是Java语言基础,对Java语言本身的方方面面都有考察,包括,类继承,类加载,内部类,字符串,原子类型等,并且不拘泥于Java语言,还辐射一些企业开发的基础知识,包括:Sevlet,XML, ORM,EJB等等。

一、选择题(本题为不定项选择,请选择出所有合适的答案,每题4分)

1.请指出下面哪个(些)语句能够合法地放在注释行“//Here”的后面?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Base{
public Base(int i){}
}
public class MyOver extends Base{
public static void main(String arg[]){
MyOver m = new MyOver(10);
}

MyOver(int i){
super(i);
}

MyOver(String s, int i){
this(i);
//Here
}
}

A. MyOver m = new MyOver();
B. super();
C. this(“Hello”,10);
D. Base b = new Base(10);

答案:D
解析:A答案不存在无参数构造器,B和C答案this和super构造器必须处于第一个语句。

2.在java中,char类型的取值范围是:

A. -2^7~2^7-1
B. 0~2^16-1
C. 0~2^16
D. 0~2^8

答案:B
解析:char是16位无符号的。

3.当你尝试进行编译和运行下列代码时会出现什么结果?

1
2
3
4
5
6
7
8
9
10
11
12
public class Bground extends Thread {
public static void main(String argv[]) {
Bground b = new Bground();
b.run();
}
public void start() {
for (int i = 0; i <10; i++) {
System.out.println("Value of i = " + i);
}
}

}

A. 编译错误并提示没有定义Thread类的运行方法。
B. 运行错误并提示没有定义Thread类的运行方法。
C. 编译通过,运行时 0到9被输出。
D. 编译通过,运行时 没有输出。

答案:D
解析:启动线程需要调用start方法,start方法会创建本地线程,本地线程会调用用户实现的run方法。

4.当你尝试进行编译和运行下列代码时会出现什么结果?

1
2
3
4
5
6
private class Base{}
public class Vis{
transient int iVal;
public static void main(String elephant[]){
}
}

A. 编译错误: 提示类Base不可以是私有的
B. 编译错误:提示整型数据不可以是瞬时的,非持久的
C. 编译错误:提示 transient 不是一个数据类型
D. 编译错误:提示main方法参数构成错误

答案:A
解析:类只有一个修饰符public, 或者没有修饰符。

5.当编译运行下列程序时会出现什么样的结果,请选择正确的答案.

1
2
3
4
5
6
7
8
9
10
11
12
public class example {
int i[] = {0};
public static void main(String args[]) {
int i[] = {1};
change_i(i);
System.out.println(i[0]);
}
public static void change_i(int i[]) {
int j[] = {2};
i = j;
}
}

A. 程序编译不通过
B. 程序输出 0.
C. 程序输出 1.
D. 程序输出 2.
E. 程序输出 4.

答案:C
解析:首先局部变量会覆盖实例变量,其次,参数传递的是引用,参数引用在被调用函数中的赋值并不影响调用函数的引用,因此在Java中引用传递的也是“值”,所以,Java中是号称只有值传递没有引用传递。

6.当编译运行下列程序时会出现什么样的结果,请选择正确的答案.

1
2
3
4
5
6
7
8
9
10
11
12
public class CharTest {
public static void main(String args[]) {
String str=new String("World");
char ch[]={'H','e','l','l','o'};
change(str,ch);
System.out.println(str + " and " + String.valueOf(ch));
}
public static void change(String str, char ch[]) {
str="Changed"; ch[0]='C';
}

}

A. World and Hello
B. World and Cello
C. Changed and Hello
D. Changed and Cello

答案:B
解析:如上题,对引用传递的参数赋值不会影响调用函数的引用,因此在change方法里面对str的更改不生效,但是对于数组元素的赋值是生效的。

7.当编译运行下列程序时会出现什么样的结果,请选择正确的答案.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package test.base;
public class MicsClazz{

public static void main(String[] args) {
String str1 = "China";
String str2 = "China";

String str3 = new String("China");
String str4 = new String("China");

System.out.print(str1==str2);
System.out.print(",");
System.out.println(str1.equals(str2));
System.out.print(str3==str4);
System.out.print(",");
System.out.println(str3.equals(str4));

}
}

A.true,true
false,true
B.false,true
false,true
C.false,true
true,true
D.true,true
false,false

答案:A
解析:==判断引用是否相等,equals判断是否两个字符串拥有相同的字符序列,str1和str2引用的是常量,是会被优化到常量池中的,因此引用相同,但是str3和str4是两个不同的对象,他们内部都引用常量池中的字符串"China"。

8.请指出下面哪个(些)语句能够合法地放在注释行“//Here”的后面?

1
2
3
4
5
6
7
8
9
10
11
12
public class TechnoSample{
static Object theObj ;
static Object[] someObj ;
static String letters[] = {"A", "B", "C", "D" };
static char[] caps = {'A', 'B', 'C', 'D' };

public static void main (String[] args){
someObj = new Object[ 3 ] ;
int[] theInts = null ;
//here?
}
}

A. theInts = caps;
B. theObj = theInts;
C. someObj = theInts;
D. theObj = caps;
E. theObj = someObj;
F. someObj = letters;

答案:BDEF
解析:任何数组都是一个对象,因此都可以赋值给一个对象,对象数组之间除非有继承关系,否则并不兼容,例如A,C, 但是F有继承关系就是兼容的。

9.请指出下面哪个(些)语句能够合法地放在注释行“//Here”的后面?

1
2
3
4
5
6
7
8
9
10
class Test1 {
float i;
public float aMethod(float a, float b) throws IOException {
return i;
}
}

class Test2 extends Test1 {
//Here
}

(1) public float aMethod(float p, float q) { return p; }
(2) float aMethod(float a, float b) { return q; }
(3) public int aMethod(int a, int b) throws Exception { return a; }
(4) public float aMethod(float a, float b) throws Exception { return i; }

A. 1,2
B. 1,3
C. 2,4
D. 1,4

答案:B
解析:override中异常可减小,可见可增大,方法签名和返回值必须相同

10.当你尝试进行编译/运行下列代码时会出现什么结果?C

1
2
3
4
5
6
7
8
9
10
11
12
13
package test.base;
1.public class Q11{
2. static String str1 = "main method with String[] args";
3. static String str2 = "main method with int[] args";
4.
5. public static void main(String[] args) {
6. System.out.println(str1);
7. }
9.
10. public static void main(int[] args) {
11. System.out.println(str2);
12. }
13.}

A.编译错误,重复的main方法,在第6行出现编译错误
B.编译错误,重复的main方法, 在第11行出现编译错误
C.编译通过,输出”main method with String[] args”
D.编译通过,输出”main method with int[] args”

答案:B
解析:override中异常可减小,可见可增大,方法签名和返回值必须相同

11.下列哪个(些)选项正确表示了把请求转发到另一个页面?

A. <%@ page:forward page=”HelloWorld.jsp” %>
B. <jsp:forward page=”HelloWorld.jsp”/>
C. <%! forward page=”HelloWorld.jsp”/>
D. <jsp:forward  jsp=”HelloWorld.jsp”/>

答案:A,B
解析:JSP指令和JSP Action

12.下面是四个关于Java类及其方法和成员变量声明的例子(假设这四个类是分别放在四个不同的类文件中的),那个(些)是不正确的?
A.public class Something {
public static void main(String[] args) {
Something s = new Something();
System.out.println(“s.doSomething() returns ” + doSomething());
}
public String doSomething() {
return “Do something …”;
}
}
B.class Something {
final int i;
public void doSomething() {
System.out.println(“i = ” + i);
}
}
C.class Something {
int i;
public void doSomething() {
System.out.println(“i = ” + i);
}
}
D.public class Something {
public static void main(String[] args) {
Other o = new Other();
new Something().addOne(o);
}
public void addOne(final Other o) {
o.i++;
}
}
class Other {
public int i;
}

答案:D
解析:答案A静态方法内不能直接调用非静态方法,答案B中final变量没有初始化,答案C中和文件名同名的类必须是public的。

13.请指出下面哪个(些)语句能够合法地(单独)放在注释行“//Here”的后面?
public class OuterClass {
private double d1 = 1.0;
//Here
}
A. class InnerOne{
public static double methoda() {return d1;}
}
B. public class InnerOne{
static double methoda() {return d1;}
}
C. private class InnerOne{
double methoda() {return d1;}
}
D. static class InnerOne{
protected double methoda() {return d1;}
}
E. abstract class InnerOne{
public abstract double methoda();
}

答案:C,E
解析:内部类不能有静态方法。

14.下列程序的运行结果将是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Circuit {
public static void main(String[] args) {
Circuit circuit=new Circuit();
If(circuit.test1(0)&amp;&amp;circuit.test2(2)&amp;&amp;circuit.test3(2)) {
System.out.println(“the statement is true);
}else{
System.out.println(“the statement is false);
}
}

public boolean test1(int value1) {
System.out.println(“test(+value1+));
System.out.println(“result:+(value1&lt;1));
Return value1&lt;1;
}

public boolean test2(int value2) {
System.out.println(“test(+value2+));
System.out.println(“result:+(value2&lt;2));
Return value2&lt;2;
}

public boolean test3(int value3) {
System.out.println(“test(+value3+));
System.out.println(“result:+(value3&lt;3));
Return value3&lt;3;
}
}

A) test(0)
result: true
test(2)
result: false
the statement is false
B) test(0)
result: true
test(2)
result: false
test(3)
result: false
the statement is false
C) test(0)
result: true
test(2)
result: false
the statement is ture
D) 以上答案都不对

答案:A
解析:&&逻辑操作符前一个操作数评估为false,后面则不再执行。

15.下面的哪个(些)陈述为true(真)?
A.HashMap和Hashtable都允许将null作为一个entry的key或者value。
B.HashMap和Hashtable继承自Dictionary类,并实现Map 接口。
C.HashMap的方法是Synchronize的,而Hashtable不是,在多个线程访问HashMap时,不需要自己为它的方法实现同步,而Hashtable 就必须为之提供外同步。
D.Hashtable和HashMap采用的hash/rehash算法都大概一样,二者性能不会有很大的差异。

答案:D
解析:A答案HashMap允许为null,但是Hashtable不允许,B答案Hashtable是继承自Dictionary,但是Hashmap不是,答案C正好说反了。

16.在RUP中,4+1软件架构视图是指什么:A
A.逻辑视图(Logic View),开发视图(Development View),进程视图(Process View),物理视图(Physical View)+场景(Scenarios)
B.概念视图(Concept View),开发视图(Development View),进程视图(Process View),物理视图(Physical View)+用例(User Cases)
C.概念视图(Concept View),实现视图(Implementation View),进程视图(Process View),部署视图(Deployment View)+场景(Scenarios)
D.逻辑视图(Logic View),开发视图(Development View),实现视图(Implementation View),部署视图(Deployment View)+用例(User Cases)

答案:A
解析:这是一个知识题,意义不大,因为不同方法论定义的视图不一样,但是需要理解视图方法对架构设计的重要性。

17.一个分布式系统中,应用程序要求使用EJB组件,下面你可以选择的服务基础件包括(假设这些基础件独立工作):C, D, E
A.Apache HTTP Server
B.Apache Tomcat
C.IBM Websphere
D.Oracle Application Server
E.JBoss

答案:C, D, E
解析:这也是个常识题,要知道HTTP server和Web容器都不是app server。

18.你已经决定从表 STUDENT 中删除掉所有数据但你同时希望能够保留 STUDENT 表的结构以便于未来使用,下面那个(些)语句是正确的:
A.DROP TABLE student;
B.TRUNCATE TABLE student;
C.DELETE* FROM student;
D.TRUNCATE TABLE student KEEP STRUCTURE;
E.DELETE* FROM student KEEP STRUCTURE

答案:B, C
解析:只有这两种方法。

19.在Message-Driven Bean中,我们应该把业务逻辑写在哪个(些)方法中,以使其可以正确的执行。

A.onMessage()方法
B.run()方法
C.service()方法
D.没有特殊的方法;可以自定义方法,然后将该方法名复制到相应的远程(Remote)接口中,暴露给客户端使用。

答案:A
解析:知识题,需了解EJB。

20.下面程序的运行结果是多少?

1
2
3
4
5
6
7
8
public class test {
public static void main(String[] args) {
int x, y;
x = 5 &gt;&gt; 2;
y = x &gt;&gt;&gt; 2;
System.out.println(y);
}
}

a. 5
b. 2
c. 80
d. 0
e. 64

答案:D
解析:二进制计算题。

二、判断题(每题2分)

1.在标准UML定义中,”has a”通常是指”聚合关系(aggregation)”,而”is a”通常是指”组合关系(composition)”
答案:错

2.对于XML文件的定义,一般采用两种形式,XML Schema和DTD;对于XML文件的解析,在Java中一般采取两种方法,DOM和SAX,其中DOM是基于事件驱动的,适合对XML进行顺序访问,而SAX是基于对象驱动的,适合对XML进行随机访问。
答案:错

3.Servlet在容器中是以多进程的方法提供服务的,对于每一次请求,容器都会从其进程池中分配相应的进程为客户端提供服务。
答案:错

4.异常(Exception)表示程序运行过程中可能出现的非正常状态;而运行时异常表示虚拟机在通常操作中可能遇到的异常,是一种常见的运行时错误。Java编译器要求方法签名必须抛出可能发生的非运行时异常,但是并不要求必须抛出未被捕获的运行时异常
答案:对

5.在设计模式中,一般把23种模式又分为“创建型”模式,“结构性”模式和“行为型”模式;我们熟悉的工厂方法(Factory Method)属于创建型模式,而单例(Singleton)和适配器(Adaptor)则属于结构型模式,迭代器(Iterator)属于行为型模式。
答案:错

三、问答题(每题5分)

1.从以下(1.1或1.2)问题中选择一个作答
1.1给定下列信息,写出连接数据库并取回相应结果集的Java(JDBC)代码。
1.数据库驱动程序名称:sun.jdbc.odbc.JdbcOdbcDriver
2.数据库URL:jdbc:odbc:CoriDB
3.数据库用户名称:CoriUser
4.数据库登录密码:CoriPwd
5.数据库表名称为:T_CORI_EMP;其中字段有EMP_ID,EMP_NAME,EMP_GENDER,EMP_ADDRESS等。
6.要求:选出EMP_ID为”20070001”的员工信息,并且将其id,姓名,性别,地址输出至标准输出
选用PreparedStatement对象

答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class RobertTest {
public static void main(String[] args) throws Exception {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

Connection conn = DriverManager.getConnection("jdbc:odbc:CoriDB", "CoriUser", "CoriPwd");
try {
PreparedStatement ps = conn.prepareStatement("select EMP_ID,EMP_NAME,EMP_GENDER,EMP_ADDRESS from T_CORI_EMP where EMP_ID = ?");
try {
ps.setString(1, "20070001");
ResultSet rs = ps.executeQuery();
try {
while (rs.next()) {
System.out.print("Emp Id: " + rs.getString(1) + " ");
System.out.print("Emp Name: " + rs.getString(2) + " ");
System.out.print("Emp Gender: " + rs.getString(3) + " ");
System.out.println("Emp Address: " + rs.getString(4) + " ");
}
} finally {
rs.close();
}
} finally {
ps.close();
}
} finally {
conn.close();
}
}
}

1.2给定下列信息,写出查找EJB对象并执行相应方法的代码(假设此场景为分布式系统,需要用远程方法调用)
1.EJB JNDI名为:CoriTestEJB
2.EJB Home接口名称为: CoriTestEJBHome
远程(remote)接口名称为: CoriTestEJB
Bean名称为:CoriTestEJBBean
3.在Bean体内有一方法,名称为findInfoByPrimaryKey,返回的类型为java.sql.ResultSet,抛出
SQLException

答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args) throws Exception {
Properties props = System.getProperties();
Context ctx = new InitialContext(props);

Object obj = ctx.lookup("HelloHome");
HelloHome home = (HelloHome)
javax.rmi.PortableRemoteObject.narrow(
obj, HelloHome.class);
Hello hello = home.create();

System.out.println(hello.hello());

hello.remove();
}

2.从以下(2.1,2.2或2.3)问题中选择一个作答
2.1能够阐述一下Struts(1.x)是如何工作的么?如:当一个请求从客户端发向服务器端时,Struts是如何组织其组件协同工作并最终返回相应的页面的?

答案:

Firstly, a http request arrives at the web container. Based the config in web.xml, the ActionServlet is called. Then ActionServlet search for the struts-config.xml to find which Action and ActionForm should used. The ActionForm is instantiated and data is copied from request object to ActionForm. Afterwards, the ActionForm is passed to Action. The execute method in Action is called. In Action.execute(…) method, the business logic will be called. For example, the operation to database. At last, an ActionForward Object is returned. Struts will forward or redirect the request based on the ActionForward. Generally, a Jsp page will be shown at last. That is to say, the response is rendered. 

2.2能够阐述一下依赖注入(Dependency Injection,或者叫反向控制IOC)的概念么?采用这种技术的优点是什么呢?能举例说明一下你在哪里用到了这种技术并且是如何具体使用的么?

答案:

Spring相关问题,可百度。

2.3能够阐述一下什么是O-R Mapping么?目前常用的O-R Mapping工具有哪些呢?选取一种你用过的,评价其特点。

答案:

Hibernate, iBatis, JPA的对比。

发表评论