Hi,大家好,我是Mic 一個工作了3年的粉絲,在面試的時候遇到一個線程相關問題。 想讓我幫他解答一下。 問題是,“什麼是守護線程,它有什麼特點” 下麵看看高手的回答。 高手: 好的。 守護線程,它是一種專門為用戶線程提供服務的線程,它的生命周期依賴於用戶線程。 只有JVM中仍然還存在用戶線程正在運 ...
轉自:
http://www.java265.com/JavaCourse/202206/3770.html
下文筆者講述java方法參數傳遞,到底傳遞了何種東西的詳細簡介說明,如下所示
在java的學習中,我們經常被問及一個問題, 調用java的參數時, java是進行的值傳遞,還是進行的引用傳遞呢? ---------------------------------------------- 筆者先告訴大家,java方法中的參數進行的值傳遞 (基礎類型傳入的是實際值,引用類型傳入的指向引用類型的記憶體地址) 那麼可能有人會問:有些傳遞的對象, 在方法裡面改變了值,外面也會發生變化, 這是為什麼呢?下文筆者將一一道來,如下所示 ----------------------------------------------
首先筆者會講述java參數存儲
在JVM的記憶體模型中 有棧和堆 棧是線程私有 每個線程都有個私有的棧 而堆是所有線程共用的 方法在執行時,都會創建一個棧幀 棧幀中的局部變數表是用來存儲一組變數值的記憶體空間 用於存放方法參數和方法內部定義的局部變數 所以當我們做如下的代碼聲明時,是在棧上開闢記憶體空間存儲 int b = 8888; User user= null; 如果我們創建對象時,user=new User()時,則會在堆上開闢記憶體空間,初始化User對象 然後再將User對象的地址賦值給user 從以上的存儲方式,我們可以看出: 基本類型和引用類型都存在棧中 引用指向的實際對象存在堆中
例
public static void main(String[] args) { int a = 88; m1(a); System.out.println("main1 a="+a); User user = new User("java265"); m2(user); System.out.println("main2 name="+user.getName()); m3(user); System.out.println("main3 name="+user.getName()); } public static void m1(int a1){ a1 = 8; System.out.println("m1 a1="+ a1); } public static void m2(user user1){ user1.setName("jjjjj"); System.out.println("m1 name="+ user1.getName()); } public static void m3(user user1){ user1 = new user("555"); System.out.println("m2 name="+ user1.getName()); } 運行結果: m1 a1=8 main1 a=88 m1 name=jjjjj main2 name=jjjjj m2 name=555 main3 name=jjjjj
從m1方法執行的結果可以驗證出 當參數傳遞的是基本類型,將實參的值複製到方法的形參中 即傳遞的是原始值的副本,操作副本不會影響原始值。 從m2方法執行的結果可以驗證出 當參數傳遞的是引用類型,是將實參的引用拷貝到方法的行參中 即:傳遞的是實參所引用的對象在堆中的地址值的副本 引用用於訪問實際對象,也就意味著對形參進行修改會影響實參。