本文写给正在努力的自己,努力的补基础知识,五道题一篇(今天有点累,题目均比较简单)
ps:我把答案都放在解析下面了
- 先来道简单的题目,以下代码输出为多少?
public class Demo3 {
static int a = 1;
public static void main(String[] args) {
int a = 10;
a++;
Demo3.a++;
System.out.println("a:" + a + " Demo.a:" + Demo3.a);
}
}
初识想法:各变各的
解析:第一个a和第二个a都开辟了新的地址值,所以在调用的时候各不相关,你变你的,我变我的
答案:a:11 Demo.a:2
- 以下代码输出为多少?
public static void main(String[] args) {
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 = y;
x.append(y);
y = x;
}
初识想法:x和y的值变了,跟我a,b有什么关系?
解析:StringBuffer不是基本类型,所以传递是引用传递,上一篇我们讲过,如果是引用传值(又称地址传值),如果使用了=就代表新开辟了一个空间来存储新的值,也就是一个(引用传递)参数a通过=改变了数据空间(如new或者赋值为null),编译解析器会将该参数解析为一个与a同类型同名的局部变量,原来的引用则会在此方法中消失
我们通过他的哈希值来验证这个说法:
但是!要注意的是通过append方法是在该地址值的基础上更改其中的值,所以这个时候a和x指向同一个地址值我们也用打印哈希值的方法来验证这个说法
- 鼠标没电了,剩下的两道题明天补