在为基本类型变量赋值时,如int a = b;是将b的值赋给a,再对b进行任何操作都不会对a产生影响。但是如果是为一个引用类型变量赋值StringBuffer a = b;,根据前一章的知识,这种操作只会改变a的引用地址值,而不会真的创建一个与b相同的对象(这种行为需要new)。所以我们要是对b进行任何操作也会影响a。这个性质如果处理不好会引发别名问题。
public class Test {
public static void main(String[] miaoch) {
int a = 1, b = 2;
swap(a, b);
System.out.println("main scope:" + a + " " + b);
}
public static void swap(int _a, int _b) {
int temp = _a;
_a = _b;
_b = temp;
System.out.println("swap scope:" + _a + " " + _b);
}
}
-----------------
swap scope:2 1
main scope:1 2
原因很简单,传递给swap函数,其实就是在swap函数作用域中做了一种赋值操作int _a = a, _b = b;在swap函数的作用域内,_a和**_b的值的确能调换,但函数执行完毕后,_a和_b**的生命周期也就完结了。自始至终,你始终无法在swap中去修改main中的a和b变量。就好比前面的例子,你把b的值赋给a,再对a做任何操作都和b无关(基本类型)。
有了上面的经验,我们再看一个例子:
public class Test {
public static void main(String[] miaoch) {
StringBuffer test = new StringBuffer("hello");
changeSB(test);
System.out.println("main scope:" + test);
}
public static void changeSB(StringBuffer _test) {
_test.append(" world!");
_test = new StringBuffer("不存在的");
System.out.println("changeSB scope:" + _test);
}
}
----------------
changeSB scope:不存在的
main scope:hello world!
StringBuffer test = new StringBuffer("hello");
//引用传递-> changeSB scope (C++中是可以做到的)
test.append(" world!");
test = new StringBuffer("不存在的");
System.out.println("swap scope:" + test);//"不存在的"
常量除了用final去声明外,还有一种直接常量。最简单的int a = 1;此处的1就是一个直接常量。常量在程序编译阶段就为其分配了内存空间,而不是像普通对象一样,用到了才会new。既然如此,那么编译器就必须准确地知道常量所占的空间大小。这里只聊直接常量。对于这个常量1,它到底是short,int,还是long呢?
直接常量后面的后缀字符标志了它的类型。如果是大写(或小写)的 L ,那就是long型,如果是D或者d那就是double型,如果是F或者f那就是float型。此外以0x开头,后面跟着0f(大写也可以)表示一个十六进制数。以0开头,后面跟着07则表示一个八进制数。当然还有利用e的写法。例如3e3。则代表3*10∧3 = 3000;