牛客网刷Java记录第一天
第一题
下列程序输出啥?
public class StringDemo{
private static final String MESSAGE="taobao";
public static void main(String [] args) {
String a ="tao"+"bao";
String b="tao";
String c="bao";
System.out.println(a==MESSAGE);
System.out.println((b+c)==MESSAGE);
}
}
解析:
做这道题之前,需要明白三个知识点:
==
符号比较引用类型时,比较的是双方的地址。String s = "xxx"
或者,String s = "xxx" + "yyy"
,这种创建String类型变量的情况,都是把变量存到常量池中。new 类名()
会在堆中创建一个对象,堆中地址当然和常量池的地址不一样。两个一模一样的玩具,一个在客厅,一个在卧室。
我在做这道题的时候,在想这样一个问题:静态常量的字符串也是存在常量池中的吗?通过在idea中debug,验证了我的猜想:静态常量的字符串也是存在常量池中的。
于是,a==MESSAGE
就是对的。
那么,b+c==MESSAGE
呢?通过追踪源码可知,因为b+c
是变量相加,所以在底层会创建一个StringBuilder类型的变量来存储b+c
的结果,存好之后,又转换为String类型,这个String类型是由StringBuilder转化过来的,但是地址还是在堆中,所以它的地址也就和MESSAGE
不同,那么结果也就是false。
答案:
true false
第二题
下列程序输出啥
class Test {
public static void main(String[] args) {
System.out.println(new B().getValue());
}
static class A {
protected int value;
public A(int v) {
setValue(v);
}
public void setValue(int value) {
this.value = value;
}
public int getValue() {
try {
value++;
return value;
} finally {
this.setValue(value);
System.out.println(value);
}
}
}
static class B extends A {
public B() {
super(5);
setValue(getValue() - 3);
}
public void setValue(int value) {
super.setValue(2 * value);
}
}
}
解析:
这题考察try-catch和多态的动态绑定机制,还涉及了一点静态内部类。
必备知识:
- 学会idea的debug功能
- try-catch中如果有return语句
-
- finally没有返回值,先把return的值保存起来。执行完finally后,执行return,返回的是保存起来的值,而不是finally中改变的值!
-
- finally有返回值,会覆盖掉try-catch中的return语句。
- 执行一个对象的方法时,是看这个对象的运行类型,啥是运行类型?就是new一个对象时,new后面那个类型。如果这个运行类型的类中没有调用的方法,就一层一层地去父类中找。如果用
super.方法名()
,那么直接去父类中找方法。再提一嘴,方法名()
等价于this.方法名()
。this是啥?就是程序当前执行的方法的调用者。
回到题目,这道题用语言来描述会有点麻烦,大家可以了解一下我前面所说的必备知识,然后自己思考一下执行流程,一定要在idea中debug一下,只需要在main方法中打一个断点即可,看看整个程序的执行流程,以后再遇到类似的题目,基本没啥问题。
答案:
22 34 17
热门相关:以嫡为贵 慕少,你老婆又重生了 紫府仙缘 魔神狂后 重生之嫡女祸妃