华为公司 java 面试题

华为公司 java 面试题

silver6 | 11 五月, 2006 17:28

第一部分:选择题
QUESTION NO: 1
1、public class Test {
public static void changeStr(String str){
str="welcome";
}
public static void main(String[] args) {
String str="1234";
changeStr(str);
System.out.println(str);
}
}
Please write the output result :

QUESTION NO:2
1. public class Test {
2. static boolean foo(char c) {
3. System.out.print(c);
4. return true;
5. }
6. public static void main( String[] argv ) {
7. int i =0;
8. for ( foo('A'); foo('B')&&(i<2); foo('C')){
9. i++ ;
10. foo('D');
12. }
13. }
14. }
What is the result?
A. ABDCBDCB
B. ABCDABCD
C. Compilation fails.
D. An exception is thrown at runtime.

QUESTION NO: 3
1. class A {
2. protected int method1(int a, int b) { return 0; }
3. }
Which two are valid in a class that extends class A? (Choose two)
A. public int method1(int a, int b) { return 0; }
B. private int method1(int a, int b) { return 0; }
C. private int method1(int a, long b) { return 0; }
D. public short method1(int a, int b) { return 0; }
E. static protected int method1(int a, int b) { return 0; }

QUESTION NO: 4
1. public class Outer{
2. public void someOuterMethod() {
3. // Line 3
4. }
5. public class Inner{}
6. public static void main( String[]argv ) {
7. Outer o = new Outer();
8. // Line 8
9. }
10. }
Which instantiates an instance of Inner?
A. new Inner(); // At line 3
B. new Inner(); // At line 8
C. new o.Inner(); // At line 8
D. new Outer.Inner(); // At line 8//new Outer().new Inner()

QUESTION NO: 5
Which method is used by a servlet to place its session ID in a URL that is written to the servlet’s response output stream?
A. The encodeURL method of the HttpServletRequest interface.
B. The encodeURL method of the HttpServletResponse interface.
C. The rewriteURL method of the HttpServletRequest interface.
D. The rewriteURL method of the HttpServletResponse interface.

QUESTION NO: 6
Which two are equivalent? (Choose two)
A. <%= YoshiBean.size%>
B. <%= YoshiBean.getSize()%>
C. <%= YoshiBean.getProperty("size")%>
D. <jsp:getProperty id="YoshiBean" param="size"/>
E. <jsp:getProperty name="YoshiBean" param="size"/>
F. <jsp:getProperty id="YoshiBean" property="size"/>
G. <jsp:getProperty name="YoshiBean" property="size"/>

QUESTION NO: 7
Which of the following statements regarding the lifecycle of a session bean are correct?
1. java.lang.IllegalStateException is thrown if SessionContext.getEJBObject() is invoked when a stateful session bean instance is passivated.
2. SessionContext.getRollbackOnly() does not throw an exception when a session bean with bean-managed transaction demarcation is activated.
3. An exception is not thrown when SessionContext.getUserTransaction() is called in the afterBegin method of a bean with container-managed transactions.
4. JNDI access to java:comp/env is permitted in all the SessionSynchronization methods of a stateful session bean with container-managed transaction demarcation.
5. Accessing resource managers in the SessionSynchronization.afterBegin method of a stateful session bean with bean-managed transaction does not throw an exception.


第二部分:概念题
1. 描述Struts体系结构?对应各个部分的开发工作主要包括哪些?













2. XML包括哪些解释技术,区别是什么?






3. JSP有哪些内置对象和动作?它们的作用分别是什么?














4、SQL问答题
SELECT * FROM TABLE

SELECT * FROM TABLE
WHERE NAME LIKE '%%' AND ADDR LIKE '%%'
AND (1_ADDR LIKE '%%' OR 2_ADDR LIKE '%%'
OR 3_ADDR LIKE '%%' OR 4_ADDR LIKE '%%' )
的检索结果为何不同?



5、SQL问答题
表结构:
1、 表名:g_cardapply
字段(字段名/类型/长度):
g_applyno varchar 8;//申请单号(关键字)
g_applydate bigint 8;//申请日期
g_state varchar 2;//申请状态
2、 表名:g_cardapplydetail
字段(字段名/类型/长度):
g_applyno varchar 8;//申请单号(关键字)
g_name varchar 30;//申请人姓名
g_idcard varchar 18;//申请人身份证号
g_state varchar 2;//申请状态
其中,两个表的关联字段为申请单号。
题目:
1、 查询身份证号码为440401430103082的申请日期
2、 查询同一个身份证号码有两条以上记录的身份证号码及记录个数
3、 将身份证号码为440401430103082的记录在两个表中的申请状态均改为07
4、 删除g_cardapplydetail表中所有姓李的记录

public class Test {
public static void changeStr(String str){
str="welcome";
}
public static void main(String[] args) {
String str="1234";
changeStr(str);
System.out.println(str);
}
}
这一题我想他主要考查 static这个关键字,changestr是个静态的方法(类方法)那么str应该也是一个静态成员,所有的对象都是公用这样的一个成员,那么对他的修改应该是可以保持的。而为什么最后的结果却是初始值1234,我有点迷惑

终 于明白了:按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。按 引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改 变。

不管是在c/c++中还是在java函数调用都是传值调用,.
当参数是对象的时候,传递的是对象的引用,这个和c/c++传递指针是一个道理,在函数中改变引用本身,不会改变引用所指向的对象,而在QUESTION NO: 1中只是改变了引用,所以在main函数中输出还是原来的那个值:1234

参数是对象时传的是地址。但str="welcome";相当于str=new String("welcome");,所以原对象没变。
可以参考以下代码:
public class Test {
public int ss = 999;
public Test(int s){
ss = s;
}
public static void changeStr(Test t){
t.ss = 888;
}
public static void main(String[] args) {
Test t = new Test(999);
changeStr(t);
System.out.println(t.ss);
}
}


public class Test {
public int ss = 999;
public Test(int s){
ss = s;
}
public static void changeStr(Test t){
t = new Test(888);
}
public static void main(String[] args) {
Test t = new Test(999);
changeStr(t);
System.out.println(t.ss);
}
}

QUESTION NO:2
1. public class Test {
2. static boolean foo(char c) {
3. System.out.print(c);
4. return true;
5. }
6. public static void main( String[] argv ) {
7. int i =0;
8. for ( foo('A'); foo('B')&&(i<2); foo('C')){
9. i++ ;
10. foo('D');
12. }
13. }
14. }
What is the result?
A. ABDCBDCB
B. ABCDABCD
C. Compilation fails.
D. An exception is thrown at runtime

做一下这个吧!!

第一题终于清楚了。

对象是传引用的。但是下面还是有区别

public class test6 {

public int ss = 999;
public test6(int s){
ss = s;
}
public static void changeStr(test6 t){
t.ss = 888;
}
public static void change(test6 t){

t = new test6(222);
}
public static void main(String[] args) {

test6 t = new test6(999);
changeStr(t);
System.out.println(t.ss);
change(t);
System.out.println(t.ss);

}
}

import javax.swing.JOptionPane;
public class Test {
public void changeStr(String str){
str="welcome";
}
public void main(String[] args) {
String str="1234";
str="welcome";
//changeStr(str);
JOptionPane.showMessageDialog(null,str);
}
}

如果这样做的话结果是welcome

在我我想说的是在C语言以后所有的参数传递都是值传递,问题是传的值是是什么,而没有什么引用传递之类的东西。

关于输出为1234而不是welcome 还有待进一步分析。
我现在去上课了,回来再和大家细说

对第一题的详细分析:
Java中函数参数传递是值传递,在C语言以后的都是这样的,关键是传进来的值是什么(这一点我在上面说了到一次)。
①如果参数是基础类型,如int型的,则传进来的是int型变量的值,这个值放在堆里。
举个例子:
void fun(int i){};
int i = 5;
fun(i);
传进fun函数的是5;
②如果参数是引用类型。如String型的,则传进来的是String型变量的值,这个值放在栈里,此值是该变量将要指向的对象的地址。
举个例子:
void fun(String str0){};
String str = "Hello";
fun(str);

fun()方法调用时第一件事就是,做了一个赋值操作:str0 = str;
这个操作的结果就是将str变量的值传给str0变量的值,也就是使得str0也指向str所指向的对象。对str0所指向的对象做修改操作,也就是对str所指的对象做修改。


有了上面的两点,我想做第一个题目一定是没什么问题的了:

说明:为了方便分析我把changeStr()方法中的参数名改成了str0。
改动后的代码如下:
1.public class Test {
public static void changeStr(String str0){
str0="welcome";
}
public static void main(String[] args) {
String str="1234";
changeStr(str);
System.out.println(str);
}
}

哎,第一题没那么复杂,都说的离谱了,具体讨论请见TIJ的附录一 关于别名和引用那一章.

我们不争论JAVA到底是传值还是传引用,因为两者某种意义上都是正确的.传值的认为传递引用本身是传值行为,这没错,可我们一般把reference当成了对象,所以说成传引用也说得过去,概念就不多说了.
为 什么str在changeStr之后没变?这是因为JAVA对所有的外覆类性(基本类型的对应类)是采用所谓的恒常对象(唯读对象,read- only),这些外覆类中的任何函数行为的调用都不会改变原对象,而是产生一个新对象,这就是为什么我们在需要动态增加String时要用 StringBuffer的原因.可对于我们自己所创建的对象,并没有这个"恒常"的特性,所以在这里有个"别名"现象,也就是几个引用同时指向一个对 象,任何一个引用对对象的修改都将影响到其他.

在这个例子中,changeStr函数的行为其实产生了一个新的对象,函数内的str是局部性的,它指向新的对象,可对原对象没有产生任何影响.

不知道我的解释清楚了,更具体讨论请见Thinking in Java

对第一题的详细分析:
Java中函数参数传递是值传递,在C语言以后的都是这样的,关键是传进来的值是什么(这一点我在上面说了到一次)。
①如果参数是基础类型,如int型的,则传进来的是int型变量的值,这个值放在堆里。
举个例子:
void fun(int i){};
int i = 5;
fun(i);
传进fun函数的是5;
②如果参数是引用类型。如String型的,则传进来的是String型变量的值,这个值放在栈里,此值是该变量将要指向的对象的地址。
举个例子:
void fun(String str0){};
String str = "Hello";
fun(str);

fun()方法调用时第一件事就是,做了一个赋值操作:str0 = str;
这个操作的结果就是将str变量的值传给str0变量的值,也就是使得str0也指向str所指向的对象。对str0所指向的对象做修改操作,也就是对str所指的对象做修改。


有了上面的两点,我想做第一个题目一定是没什么问题的了:

说明:为了方便分析我把changeStr()方法中的参数名改成了str0。
改动后的代码如下:
1.public class Test {
2. public static void changeStr(String str0){
3. str0="welcome";
4. }
5. public static void main(String[] args) {
6. String str="1234";
7. changeStr(str);
8. System.out.println(str);
9. }
10.}

第7行代码执行过程如下:
将str的值赋给str0,使得str0和str指向同一个String类对象1234
而 在changeStr()方法中第3行代码执行的结果是将str0值(也就是对象的地址)做了修改,str0的值为String类对象welcome的地 址,这样一来,使得str和str0所指向的对象不再是同一个对象了,而且str的值并没有改变,也就是说str还是指向String类对象1234的。

综上所述,程序最终的结果一定是1234。

补充:
ziyongkun 在 2006-05-10 10:08:00 发的贴子里说的不是很对,并不是一个副本的问题,它们会指向同一个对象的。

QUESTION NO:2
1. public class Test {
2. static boolean foo(char c) {
3. System.out.print(c);
4. return true;
5. }
6. public static void main( String[] argv ) {
7. int i =0;
8. for ( foo('A'); foo('B')&&(i<2); foo('C')){
9. i++ ;
10. foo('D');
12. }
13. }
14. }
========================================================================
考察的是for语句的执行过程:
for(1;2;3)
过程如下:
1;
2;
3;
2;
.
.
.
当i<2时,便不再执行。其实是基础&细心~~~~~~~

4、SQL问答题
SELECT * FROM TABLE

SELECT * FROM TABLE
WHERE NAME LIKE '%%' AND ADDR LIKE '%%'
AND (1_ADDR LIKE '%%' OR 2_ADDR LIKE '%%'
OR 3_ADDR LIKE '%%' OR 4_ADDR LIKE '%%' )
的检索结果为何不同?
=========================================================
前者检索全部,后者有三种情况检索不出:NAME=null或ADDR=null或1_ADDR LIKE 2_ADDR 3_ADDR 4_ADDR其一为null.

4、SQL问答题
SELECT * FROM TABLE

SELECT * FROM TABLE
WHERE NAME LIKE '%%' AND ADDR LIKE '%%'
AND (1_ADDR LIKE '%%' OR 2_ADDR LIKE '%%'
OR 3_ADDR LIKE '%%' OR 4_ADDR LIKE '%%' )
的检索结果为何不同?

答:前者检索所有记录,后者只能检索出 NAME 和ADDR中非Null的记录。


5、SQL问答题
表结构:
1、 表名:g_cardapply
字段(字段名/类型/长度):
g_applyno varchar 8;//申请单号(关键字)
g_applydate bigint 8;//申请日期
g_state varchar 2;//申请状态
2、 表名:g_cardapplydetail
字段(字段名/类型/长度):
g_applyno varchar 8;//申请单号(关键字)
g_name varchar 30;//申请人姓名
g_idcard varchar 18;//申请人身份证号
g_state varchar 2;//申请状态
其中,两个表的关联字段为申请单号。
题目:
1、 查询身份证号码为440401430103082的申请日期
select A.g_applydate
from g_cardapply A inner join g_cardapplydetail B on A.g_applyno = B.g_applyno
where B.g_idCard = '440401430103082'

2、 查询同一个身份证号码有两条以上记录的身份证号码及记录个数
select g_idCard,count(*) as Cnt from g_cardapplydetail
group by g_idcard
having count(*) > 1

3、 将身份证号码为440401430103082的记录在两个表中的申请状态均改为07
update g_cardapplydetail set g_state = '07'
where g_idcard = '440401430103082'

update A set g_state = '07'
from g_cardapply A inner join g_cardapplydetail B on A.g_applyno = B.g_applyno
where B.g_idcard = '440401430103082'


4、 删除g_cardapplydetail表中所有姓李的记录
delete from g_cardapplydetail
where g_name like '李%'

3、 将身份证号码为440401430103082的记录在两个表中的申请状态均改为07
update g_cardapplydetail set g_state = '07'
where g_idcard = '440401430103082'

update A set g_state = '07'
from g_cardapply A inner join g_cardapplydetail B on A.g_applyno = B.g_applyno
where B.g_idcard = '440401430103082'

5、SQL问答题:
/*Select g_cardapply. g_applydate
From g_cardapply, g_cardapplydetail
Where g_cardapply. g_applyno=g_cardapplydetail. g_applyno
And g_cardapplydetail.g_idcard='440401430103082'*/

/*Select *From (select count(*) g_count , g_idcard
From g_cardapplydetail
Group by g_idcard ) a
Where a. g_count >= 2*/

/*Update g_cardapply
set g_state='07'
where g_applyno in (select distinct g_applyno
from g_cardapplydetail
where g_idcard ='440401430103082')
update g_cardapplydetail
set g_state='07'
where g_idcard='440401430103082' */

/*Delete from g_cardapplydetail
Where g_name like '李%'*/
通过测试
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值