java的堆栈方法区(结合线程、方法的调用之间变量的传递)

1.堆:声明的对象、属性在堆中(引用变量在栈中)。

2.方法区:类、方法、常量池在方法区。

3.栈:栈中存放的是局部变量和对象的引用变量(8中基本变量存的是值,引用变量单独用一种方式存储)。

堆区和方法区:线程共享数据; 栈区:数据不共享(每个线程分配一块单独的栈内存),因为栈内存不共享,里面的局部变量和引用变量不共享,所有线程之间的数据是不共享的。线程是安全的。

类中的方法调用:方法调用传递参数对象,其实传递的是引用变量,被调用的方法接受的时候是重新创建用引用变量接受的,新建的引用变量和传递的引用变量指向同一个对象而已。上代码:

package test;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.sun.xml.internal.ws.util.StringUtils;

import te.test9;

public class test1 {

    public static void main(String[] args) {
        
        test9 t1=new test9();
        t1.setName("A");
        chanege1(t1);
        System.out.println(t1.getName());
        boolean f=false;
        chanege2(f);
        System.out.println(f);

        
        
    }
   
    public static void chanege1(test9 t)  {
//        System.out.println(t);
//        t.setName("b");
       t=new test9();
       t.setName("B");
//       System.out.println(t);
    }
    public static void chanege2(boolean flag)  {
        flag=true;
     }

}

输出结果:A
false

解释:1)引用首先t1对象在栈中创建一个t01引用变量指向堆中的new test9();  2)调用方法:chanege1(t1);将t1对象传递过去,

chanege1方法中创建一个t02引用变量接受t01,(此时t01和t02都指向t1对象), t=new test9();此时t01指向第一个对象,t02指向新的对象,给t02的对象赋值B,此时t01的对象内容不变,只是t02对应的堆中的信息变了。回调后所以输出是A(t01的对象是信息是没有变的)。第二个方法也是这个情况。(这种参数的调用就是就是在被调的方法中创建新的引用或者变量接受传递过来的值)。纯粹个人理解。

猜你喜欢

转载自blog.csdn.net/dhq_blog/article/details/82147912