一、单选
1、以下代码结果是什么()
public class foo { public static void main(String sgf[]) { StringBuffer a=new StringBuffer("A"); StringBuffer b=new StringBuffer("B"); operate(a,b); System.out.println(a+"."+b); } static void operate(StringBuffer x,StringBuffer y) { x.append(y); y=x; } }
A. 代码可以编译运行,输出“AB.AB”。
B. 代码可以编译运行,输出“A.A”。
C. 代码可以编译运行,输出“AB.B”。
D. 代码可以编译运行,输出“A.B”。
答案:C
引用类型的传参传递的是地址。所以上述代码中的operate方法中给x拼接一个y的值,那么a的值就是AB,将x赋值给y表示的是将对象地址传给了y,y=x表示的是让y指向了其他对象。所以b的值没有变化,所以最终结果为AB.B
2、 在JAVA中,假设A有构造方法A(int a),则在类A的其他构造方法中调用该构造方法和语句格式应该为()
A. this.A(x) B. this(x) C. super(x) D. A(x)
答案:B
this.只能是类中的普通方法和属性,不能是构造方法,想要在类A的其他构造方法中调用这个构造方法使用的是this(x).
3、下面代码的运行结果是()
public static void main(String[] args){ String s; System.out.println("s="+s); }
A. 代码编程成功,并输出”s=”
B. 代码编译成功,并输出”s=null”
C. 由于String s没有初始化,代码不能编译通过。
D. 代码编译成功,但捕获到NullPointException异常
答案:C
这个s变量由于是在方法中,所以他是一个局部变量,Java中想要使用局部变量,就必须先给变量初始化。
4、以下代码的返回值是()
public boolean returnTest(){ try{ return true; }catch (Exception e){ }finally{ return false; } }
A. true B. false
答案:B
按照我们正常的思维程序遇到return就结束了,但是由于是try-catch,finally是一定会被执行的,最后执行的是finally中的代码,所以程序的输出结果为false.
5、指出以下程序运行的结果是
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
这个题和第一个题类似,引用类型传参,传递的是对象的地址,并不是对象的值。所以change方法中对对象的值做出的改变,会影响到方法外部的对象,但是change方法中str对象表示的意思为修改了形参str的执行,而不是修改对象中的值,并没有改变外部str的值。ch数组中将0下标位置的值修改为g,所以程序的最终输出结果为good and gbc.
二、多选
下列有关JAVA异常处理的叙述中正确的是()
A. finally是为确保一段代码不管是否捕获异常都会被执行的一段代码
B. throws是用来声明一个成员方法可能抛出的各种非运行异常情况
C. final用于可以声明属性和方法,分别表示属性的不可变及方法的不可继承
D. throw是用来明确地抛出一个异常情况
答案:ABD
final修饰方法表示这个方法不能被重写,而不是被继承。
三、 统计回文
题目描述
题目解析
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str1 = scan.nextLine();
String str2 = scan.nextLine();
//1、向str1中插入字符串str2。但是不能直接在str1字符串中插入,会导致str1发生改变
//我们需要创建一个变量,使这个变量等于str1的值,对这个变量中的值进行修改
int count = 0;
//这里i能够等于str1的长度,是因为插入元素的时候,也可以插入到字符串的末尾
for (int i = 0; i <= str1.length(); i++) {
StringBuffer str3 = new StringBuffer(str1);
str3.insert(i,str2);
//2、逆置字符串str3
StringBuffer str4 = new StringBuffer(str3);
str4.reverse();
//3、判断逆置前后字符串是否相同
if(str4.toString().equals(str3.toString())){
count++;
}
}
System.out.println(count);
}
}
代码讲解:
- 第一次创建StringBuffer对象是因为要创建一个新的对象,对新的对象进行操作,如果使用String来创建一个变量指向str1的话,只是将str1的地址传给了它,修改的对象还是str1所指向的对象。
- 第二此创建新的StringBuffer对象是因为reverse方法操作的是,调用它的对象,不会返回新的对象,我们需要将逆置的对象的值与没有逆置的进行对比,判断是否为回文串。
- 第3步时判断两个字符串是否相等,为什么不直接使用equals进行比较,还要调用toString方法。这是因为StringBuffer类中没有equals方法,我们需要使用toString方法将StringBuffer类型的对象转换成String类型的对象。