zoukankan      html  css  js  c++  java
  • java虚拟机存储区

    方法区和堆区是数据共享区。

    栈区:数据不共享。方法参数、局部变量、参与运算的中间结果、返回值等等都在栈区中。

    堆区:数据共享。存放对象。

    方法区存放类型信息,类型信息包括:字段信息、方法信息、该类型的常量池、类变量、一个到类ClassLoader的引用,一个到Class类的引用。这部分数据是共享的,是一个Java虚拟机实例或者说一个Java程序共享的。

    当一个类被多个不同的ClassLoader加载的时候,需要对ClassLoader标识。同时也要标识一个Class类,他的完全限定名。

    public class Test {
            
        int a;
        int b;
        public static void main(String[] args) {
            int c = 20;
            Test test = new Test();
            test.change(test,c);
            System.out.println(test.a+" first "+c);
        }
        
        public void change(Test t,int c){
            c=50;
            t.a=10;
            t = new Test();
            t.a=20;
            System.out.println(t.a+" second");
        }
    }

    结果是:

    20 second
    10 first 20

    main方法和change方法会在java栈中开辟两个栈帧,一个方法对应一个栈帧,当前栈帧代表调用当前的方法,每个栈帧会有他的数据结构,他的数据结构就是在前面提到的栈区存放的东西。

    main方法接受一个args参数和定义两个局部变量。

    int c = 20;那么会在这个栈帧定义一个值为20,名为c的变量。暂时可以这么理解,更细的话就要看他执行的时机了。

    Test test  = new Test();

    这样一new做的事情可以多了。先看右边,他在堆区开辟一个存储空间,这个存储空间有地址值,并且这块空间持有一个类型信息在方法区的引用。那么方法区的那块空间就描述着该类的类型信息了,包括字段、方法、类变量等等,上面有。

    左边是一个Test类型的引用,他持有的是堆区那块地址值。

    当main方法调用change时,是把上面传过去呢?其实是把值传过去了,把对象的地址值和20传过去了。

    change方法接受这两个参数,他就会为这两个参数在栈区中开辟两块存储空间,用来存储这两个参数,在这里没有定义方法的局部变量。

    这时t=传进来的地址值,c=20;

    现在变化来了,改变他们的值。c=50;他这里改变改变的是谁的值呢。其实是改变了属于change方法这个栈帧的变量值。而没有改变到main方法栈帧的变量值。所以在打印的时候c还是20,不要因为变量名而迷惑了。

    下一步:t.a=10;这时候这个a是属于传进来对象的,也就是第一个对象。他的a被改变了,等于10。

    再下一步:t = new Test();这时候堆区就有两个对象了,这个t的值不再是以前对象的地址值了,而是新的对象的地址值了,那这个新的对象也有自己的成员字段和方法,等等。

    最后t.a=20;改变的是新对象的a变量,而不是以前的。

    所以结果就这样了。

    Java中方法参数的传递都是传值,引用数据类型传的是地址值,字符串传的是"内容",基本数据类型就是普通的值。

  • 相关阅读:
    javascript/jquery操作cookie
    更改IE/FireFox查看源代码的默认编辑器,比如notepad++
    javascript refresh page 几种页面刷新的方法
    C# Enum,Int,String的互相转换 枚举转换
    js中两个感叹号的作用
    JQuery操作iframe
    JQuery判断一个元素下面是否有内容或者有某个标签
    Meta标签详解
    五一放假回校,真爽
    ASP.NET错误处理(一)摘自MSDN
  • 原文地址:https://www.cnblogs.com/hjy9420/p/4273208.html
Copyright © 2011-2022 走看看