參數(shù)傳遞
Java中其實是值傳遞的,只不過對于對象參數(shù)蕾久,值的內(nèi)容是對象的引用
值傳遞(pass by value)是指在調(diào)用函數(shù)時將實際參數(shù)復(fù)制一份傳遞到函數(shù)中婉宰,這樣在函數(shù)中如果對參數(shù)進(jìn)行修改歌豺,將不會影響到實際參數(shù)。
引用傳遞(pass by reference)是指在調(diào)用函數(shù)時將實際參數(shù)的地址直接傳遞到函數(shù)中心包,那么在函數(shù)中對參數(shù)所進(jìn)行的修改类咧,將影響到實際參數(shù)。
1. 基本數(shù)據(jù)類型
@Test
public void test01(){
int x = 3;
System.out.println("x = " + x);
changeData(x);
System.out.println("x = " + x);
}
public void changeData(int e){
e = 4;
}
結(jié)果:3
2. 引用數(shù)據(jù)類型
@Test
public void test02(){
Dog dog = new Dog("A");
func(dog);
System.out.println(dog.getName());
}
public void func(Dog dog){
dog.setName("B");
}
class Dog {
String name;
Dog(String name) {
this.name = name;
}
String getName() {
return this.name;
}
void setName(String name) {
this.name = name;
}
String getObjectAddress() {
return super.toString();
}
}
輸出結(jié)果為:B
當(dāng)在test02中創(chuàng)建Dog對象時蟹腾,在堆中開辟一塊內(nèi)存痕惋,其中保留了name數(shù)據(jù),然后dog持有該內(nèi)存地址娃殖,例如0x123456血巍,當(dāng)調(diào)用func函數(shù)時,會把地址交給形參dog,這是這兩個都指向了這個地址珊随,函數(shù)里面修改時,會修改對象
通過概念我們也能知道柿隙,這里是把實際參數(shù)的引用的地址復(fù)制了一份叶洞,傳遞給了形式參數(shù)。所以禀崖,上面的參數(shù)其實是值傳遞衩辟,把實參對象引用的地址當(dāng)做值傳遞給了形式參數(shù)。
float和double
Java 不能隱式執(zhí)行向下轉(zhuǎn)型波附,因為這會使得精度降低艺晴。
- 1.1字面量屬于 double 類型,不能直接將 1.1 直接賦值給 float 變量掸屡,因為這是向下轉(zhuǎn)型封寞。
float f = 1.1; //錯誤,應(yīng)該改為double f = 1.1 或者float f = 1.1f
- 1.1f 字面量才是 float 類型仅财。
float f = 1.1f;
隱式類型轉(zhuǎn)換
因為字面量 1 是 int 類型狈究,它比 short 類型精度要高,因此不能隱式地將 int 類型向下轉(zhuǎn)型為 short 類型盏求。
short j = 1; //可以
j = j + 1; //報錯
int k = 1;
short t = k; //報錯
但是使用 += 或者 ++ 運算符會執(zhí)行隱式類型轉(zhuǎn)換抖锥。
j += 1;
j++;
上面的結(jié)果相當(dāng)于s1 = (short) (s1 + 1);
switch
從 Java 7 開始亿眠,可以在 switch 條件判斷語句中使用 String 對象。
String s = "a";
switch (s) {
case "a":
System.out.println("aaa");
break;
case "b":
System.out.println("bbb");
break;
}
switch 不支持 long磅废,是因為 switch 的設(shè)計初衷是對那些只有少數(shù)幾個值的類型進(jìn)行等值判斷纳像,如果值過于復(fù)雜,那么還是用 if 比較合適拯勉。