黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

Java教程
Java標識符與關鍵字
Java變量
Java數據類型
Java運算符
Java控制語句
Java方法
Java面向對象
Java對象的創建和使用
Java封裝
Java中static和this
Java繼承
Java方法覆蓋和多態
Java super
Java基礎練習題

Java方法調用時參數的傳遞問題

方法在調用的時候參數是如何傳遞的呢?其實在調用的時候參數傳遞給方法,這個過程就是賦值的過程,參數傳遞和“賦值規則”完全相同,只不過參數傳遞在代碼上看不見“=”運算符。我們先來深入的研究一下“賦值規則”吧!

public class AssignmentTest {
	public static void main(String[] args) {
		//基本數據類型
		int a = 10;
		int b = a; //a賦值給b,a把什么給了b?
		//引用數據類型
		Bird bird1 = new Bird("polly");
        //bird1賦值給bird2,bird1把什么給了bird2?
		Bird bird2 = bird1; 
	}
}
class Bird {
	String name;
	public Bird(){}
	public Bird(String _name){
		name = _name;
	}
}

在以上程序當中,有兩個疑問,第一個:a賦值給b,a把什么給了b?第二個:bird1賦值給bird2,bird1把什么給了bird2?

其實a,b,bird1,bird2就是4個普通的變量,唯一的區別只是a和b都是基本數據類型的變量,bird1和bird2都是引用數據類型的變量(或者說都是引用),a變量中保存的那個“值”是10,bird1變量中保存的那個“值”是0x8888(java對象內存地址),本質上來說10和0x8888都是“值”,只不過一個“值”是整數數字,另一個“值”是java對象的內存地址,大家不要把內存地址特殊化,它也是一個普通的值。

那么“賦值”是什么意思呢,顧名思義,賦值就是把“值”賦上去。a賦值給b,本質上不是把a給了b,而是把a變量中保存的“值10”復制了一份給了b。bird1賦值給bird2本質上不是把bird1給了bird2,而是把bird1變量中保存的“值0x8888”復制了一份給了bird2。請看以下內存圖的變化:

Java技術架構

Java技術架構

圖9-33:賦值原理圖

通過以上內存圖我們可以看出“賦值”運算的時候實際上和變量的數據類型無關,無論是基本數據類型還是引用數據類型,一律都是將變量中保存的“值”復制一份,然后將復制的這個“值”賦上去。他們的區別在于,如果是基本數據類型則和堆內存當中的對象無關,如果是引用數據類型由于傳遞的這個值是java對象的內存地址,所以會導致兩個引用指向同一個堆內存中的java對象,通過任何一個引用去訪問堆內存當中的對象,此對象內存都會受到影響。我們來驗證一下,讓a++,a應該變成了11,但是b不會變,讓bird1.name = “波利”,然后輸出bird2.name的結果肯定也是”波利”,請看代碼以及運行結果:

public class AssignmentTest {
	public static void main(String[] args) {
		//基本數據類型
		int a = 10;
		int b = a; //a賦值給b,a把什么給了b?
		a++;
		System.out.println("a = " + a);
		System.out.println("b = " + b);
		//引用數據類型
		Bird bird1 = new Bird("polly");
        //bird1賦值給bird2,bird1把什么給了bird2?
		Bird bird2 = bird1; 
		System.out.println("bird1's name = " + bird1.name);
		System.out.println("bird2's name = " + bird2.name);
		bird1.name = "波利";
		System.out.println("bird1's name = " + bird1.name);
		System.out.println("bird2's name = " + bird2.name);
	}
}
class Bird {
	String name;
	public Bird(){}
	public Bird(String _name){
		name = _name;
	}
}

運行結果如下圖所示:

Java開發

圖9-34:賦值原理測試

上面我就提到了,方法調用時參數的傳遞和賦值運算符的原理完全相同,那么請大家根據以上內容所學,畫出以下程序的內存圖,以及推算它們的執行結果:

public class ParameterTransferTest01 {
	public static void main(String[] args) {
		int i = 10;
		add(i);
		System.out.println("main's i = " + i);
	}
	public static void add(int i){
		i++;
		System.out.println("add's i = " + i);
	}
}
public class ParameterTransferTest02 {
	public static void main(String[] args) {
		User user = new User(20);
		add(user);
		System.out.println("main's user age = " + user.age);
	}
	public static void add(User user) {
		user.age++;
		System.out.println("add's user age = " + user.age);
	}
}
class User{
	int age;
	public User(){}
	public User(int _age){
		age = _age;
	}
}

 

全部教程
主站蜘蛛池模板: 成人h视频| 国产精品天天看天天爽 | 欧美18~20性hd | 亚洲天天综合网 | 亚洲无线乱码高清在线观看一区 | 波多野结衣四虎 | 国产亚洲欧美另类第一页 | 我想看黄色一级片 | yy4138殇情理论片一级毛片 | 看免费毛片 | 男女涩涩网站 | 玖草福利视频 | 在线观看色视频 | 中文字幕在线观看你懂的 | 婷婷中文字幕 | 天天做天天爱夜夜想毛片 | 中文字幕亚洲欧美 | 欧美一级高清片欧美国产欧美 | 成人免费黄色小视频 | 看全色黄大色大片免费 | 精品亚洲视频在线 | 亚洲欧洲日韩综合色天使不卡 | 无遮羞肉体动漫影院免费版 | 妞干网最新 | 成人欧美一区二区三区黑人免费 | 伊人国产在线播放 | 国产精品久久久久久久专区 | 亚洲国产精品一区二区久 | 日韩精品视频免费 | 最近中文字幕2019视频1 | 男人最爱看的网站 | 欧美zozozo人禽交免费大片 | 激情婷婷成人亚洲综合 | 在线免费观看视频黄 | 成人你懂的 | 日本宅男午夜免费永久网站 | 日韩精品一区二区三区免费观看 | 理论片毛片 | 日韩一级二级三级 | 日韩精品久久久久影院 | 欧美午夜成年片在线观看 |