A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马李文 中级黑马   /  2013-6-7 21:59  /  1646 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马李文 于 2013-6-8 21:40 编辑

Person p = new Person() 在堆内存中新建了new person 而setAge在person类中 ,但为什么setAge是在栈内存中呢? 求解释~~
  1. class Person
  2. {
  3.         private int age;
  4.         public void setAge(int a)
  5.         {
  6.                 if(a>0 && a<130)
  7.                 {
  8.                         age=a;
  9.                         speak();
  10.                 }
  11.                 else
  12.                         System.out.println("feifa age");
  13.         }

  14.         public int getAge
  15.         {
  16.                 return age;
  17.         }
  18.         void speak()
  19.         {
  20.                 System.out.println("age="+age);
  21.         }
  22. }

  23. class Persondemo
  24. {
  25.         public static void main(String[] args)
  26.         {
  27.                 Person p = new Person();
  28.                 p.setAge(20)
  29.         }
  30. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黑马伍哲沂 + 1 神马都是浮云

查看全部评分

4 个回复

正序浏览
黑马李文 发表于 2013-6-7 22:38
我可以这么理解吗  就是setAge被调用 而他里面的局部变量是在栈内存中的   你说的方法区是指~? ...

你可以这么理解的
我说的方法区就是 setAge  方法区 指的是你不是写了很多源代码么? 编译成class文件  这个class文件里面对应的setAge代码本身 "public void setAge(int a){...}"这个东西是不是也要存储在内存中才能被执行?
代码本身存储在方法区  

线程运行代码的时候:(这是个人理解)到方法区读取setAge这段代码"public void setAge(int a){...}"  读到第一行  int a 就会在栈内存中开辟一个属于setAge的内存范围  里面就有一个变量 叫a  并把调用这个方法传的值20赋值给这个a
接着在这个方法区中读到“if(a>0 && a<130)”  他就会到栈内存中判断 a(这个时候值为20)是不是大于0并且小于130啊?  他就按照他在方法区中你写的代码来到对内存或者栈内存等地方执行相应的操作
回复 使用道具 举报
张歆明 发表于 2013-6-7 22:22
*************************************************************************************************
Pe ...

我可以这么理解吗  就是setAge被调用 而他里面的局部变量是在栈内存中的   你说的方法区是指~?
回复 使用道具 举报
*************************************************************************************************
Person p = new Person() 在堆内存中新建了new person 而setAge在person类中 ,但为什么setAge是在栈内存中呢? 求解释~~
*************************************************************************************************
首先说代码本身也是要存储到内存才能被线程执行的 所以  你的setAge的代码本身:
public void setAge(int a)
        {
                if(a>0 && a<130)
                {
                        age=a;
                        speak();
                }
                else
                        System.out.println("feifa age");
        }

是存储在方法区的Person类对应的区域

堆内存里面存储的仅仅是对象的成员变量

那么 当线程运行你的setAge方法时候  是不是要产生很多临时变量啊  这些在setAge(){}方法中定义和使用的临时变量就要在栈内存中开辟空间

所以  毕老师在讲解这部分的时候 为了大家能区分出来  栈内存中哪一部分的局部变量是main方法的 那一部分的局部变量是setAge方法的  就各自画了一个框 在里面第一行写上这个方法的名字
这不代表方法存储在栈内存中  代表这个时候  OS为这个方法要产生的临时变量生成一个可以存放的内存区域  
按照这个例子说  这个时候  在栈内存中  对应setAge方法(毕老师会画出来一个框 表上setAge)中的临时变量 a 就要在栈内存中创建

评分

参与人数 1技术分 +2 收起 理由
黑马伍哲沂 + 2 很详细很认真。

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马