zoukankan      html  css  js  c++  java
  • java基础-变量和堆栈

    public class Test {
    private String name;//成员变量,也是全局变量

    public void changeName() {
    String n = "tomoya";//n就是局部变量
    name = n;
    }
    }

    总的来说,定义在类里的,也就是name那个位置知,就是成员变量,在JAVA里全局变量和成员变量是一个意思。
    定义在方法里或域里就叫做局部变量,所谓域就是{}里面,比如
    public void show() {
    int b = 2;//局部变量
    if(true) {
    int a = 1;//局部变量
    }
    //这个位置访问a,无效
    }
    //这个位置,或其他方法里访问b,无效

    他的作用范围:
    局部变量离开了他的域{}就无效


    成员变量的范围依赖他的访问修饰符

    而且!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    局部变量,如果是基本数据类型,那么就直接存在中,如果是应用数据类型,比如String str = new String("12");,会把对象存在堆中,对象的引用(指针)存在栈中,

    所以java里基本数据类型存在上,可以理解为就是boolean,short,int,char,float,double,long,byte这8种

    ------------------------------------------------手动分割-------------------------------------------------------------------------------------------

    成员变量,类的成员在不同对象中各不相同,基本数据类型和引用数据类型都存储在这个对象中,作为一个整体存储在堆中。

    而类的方法是所有的对象共享的,方法是存在方法区的,只用当调用的时候才会被压栈,不用的时候是占内存的。

    李刚的《疯狂Java》第128页开始,有一个类从初始化开始,

    在内存发生什么变化的详细过程,这里简单记录一下。

    1.  
      class Person{
    2.  
          String name;
    3.  
          static int eyeNum;
    4.  
      }

    上面这个Person类,有成员变量name和静态成员变量eyeNum了,

    当执行下面语句:

    1.  
      Person p1 = new Person();
    2.  
      Person p2 = new Person();
    3.  
      p1.name = "A";
    4.  
      p2.name = "B"
    5.  
      p1.eyeNum = 2;
    6.  
      p2.eyeNum = 3;
    1. Person p1 = new Person();第一次使用Person类,系统在内存为Person类分配空间,其中也包括了静态成员变量eyeNum(初始值为0)。

    2. 然后,在堆内存new一个Person对象,其中name为null,然后将p1指向这个对象。

    3. 接着new p2时,因为类已经初始化了,只需重复第2步就行了。

    4. p1.name = "A"; 让堆内存中p1对象的name指向一个"A"字符串。

    5. p1.eyeNem = 2;此时通过Person对象修改Person的类属性(因为是静态成员变量),Person类的eyeNum属性被赋值为2。


    类的成员变量都在上,只有方法里面定义的基础变量,在方法里面定义的引用
    其他对象的引用放在栈上(这个时候被引用的对象和它的成员变量还是在堆上)

    也就是说,线程上下文的东西在栈上,其他统统在堆上。

  • 相关阅读:
    C语言 递归 汉诺塔问题 最大公约数问题
    程序的健壮性及代码风格
    C程序练习
    专题——条件控制循环 猜数游戏 随机种子
    C语言 分支与循环 递推思想 穷举 流程的转移控制
    C指针 指针和数组 二维数组的指针 指针应用
    C语言实现的排序
    数组查找算法的C语言 实现-----线性查找和二分查找
    图片转成base64 跨域等安全限制及解决方案
    移动开发那些坑之——safari mobile click事件的冒泡bug
  • 原文地址:https://www.cnblogs.com/yangj-Blog/p/12963684.html
Copyright © 2011-2022 走看看