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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Rockray 高级黑马   /  2013-10-6 13:35  /  2505 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Rockray 于 2013-10-7 14:23 编辑

先上一张图,是毕向东老师的ppt

毕向东老师分别提到 “成员变量定义在类中,局部变量定义在局部范围内(函数内和语句内)
                                “ 成员变量存在于堆内存中,局部变量存在于栈内存中
关于这两点有个疑问,请见如下代码:
  1. class Car {
  2.     String color;
  3.     int num;
  4.     color = "red";
  5.     num = 4;
  6.     void show() {
  7.         System.out.print(color+" "+num);
  8.     }
  9. }

  10. class Demo {
  11.     public static void main(String[] args) {
  12.         Car c = new Car();  //创建一个Car类型的对象,存储在堆内存
  13.         c.color = "black";  //把这个对象的color属性修改为“black”
  14.         c.show;             //使用这个对象的show()函数,函数中封装功能
  15.     }
  16. }
复制代码
内存分析图:

Car 类中的变量 color 和 num 确实是成员变量,因为他们既是在类中又是在堆内存中
但 Demo 类中的 变量 c 到底是成员变量还是局部变量?
从内存位置看,变量 c 在栈内存中,应该是局部变量
从类中位置看,变量 c 直接存在于类中,应为成员变量
但若是因为 变量 c 在 main() 函数中而是局部变量,那以下代码中的岂不均是局部变量而没有成员变量?
  1. //冒泡排序
  2. public class MaoPao {
  3.     public static void BubbleSort(int[] a) {
  4.         for(int x=0;x<a.length-1;x++) {
  5.             for(int y=0;y<a.length-x-1;y++) {    //-x:让每一次比较的元素数少x个。-1:防止脚标过界。
  6.                 if(a[y]>a[y+1]) {
  7.                     int t;
  8.                     t=a[y+1];
  9.                     a[y+1]=a[y];
  10.                     a[y]=t;
  11.                 }
  12.             }
  13.         }
  14.     }
  15.     public static void Print(int[] a) {
  16.         System.out.print("[ ");
  17.         for(int i=0;i<a.length;i++) {
  18.             System.out.print(a[i]+" ");
  19.         }
  20.         System.out.println("]");
  21.     }
  22.     }
  23.     public static void main(String[] args) {
  24.         int[] a=new int[]{3,1,2,8,5,10,4,12};
  25.         Print(a);
  26.         BubbleSort(a);
  27.         Print(a);
  28.     }
  29. }
复制代码
还有一个疑问,除了函数内,若语句内的变量为局部变量,但是定义成员变量的也是个语句啊,这怎么解释?


评分

参与人数 1技术分 +2 收起 理由
黄文伯 + 2 赞一个!

查看全部评分

5 个回复

倒序浏览
这个不是一个概念,你那个DEMO中的Car c是创建了一个对象,不是变量。成员变量是类中定义的,局部变量一般定义在方法函数中,不要纠结什么句子
回复 使用道具 举报
横塘西岸 发表于 2013-10-6 16:14
这个不是一个概念,你那个DEMO中的Car c是创建了一个对象,不是变量。成员变量是类中定义的,局部变量一般 ...

你的意思是“Car c = new car()” 中的 C 不是变量?
但是C是存在栈内存中的啊,它本身并不是对象,而是指向了存储在堆内存中的对象。
我感觉 C 应该是个变量,它存储着对象在堆内存的地址,借以指向对象。
回复 使用道具 举报
是不是我问的太简单了,才没人回复啊{:soso_e143:}
回复 使用道具 举报
我来回答你吧:
1.但 Demo 类中的 变量 c 到底是成员变量还是局部变量?
答:是局部变量
2.从内存位置看,变量 c 在栈内存中,应该是局部变量,---------------这句话话是正确的
3.从类中位置看,变量 c 直接存在于类中,应为成员变量。-------------这句话是错误的,因为c存在于main函数中,所以呢,它怎么可能是成员变量呢?如果你把c变量的定义放在main函数的上面它就是成员变量了。
4.但若是因为 变量 c 在 main() 函数中而是局部变量,那以下代码中的岂不均是局部变量而没有成员变量?
答:确实是没有成员变量,没有谁说一个类必须要有成员变量

还有一个疑问,除了函数内,若语句内的变量为局部变量,但是定义成员变量的也是个语句啊,这怎么解释?
答:语句内的变量,因为我没有看视频,我的理解应该是语句块吧
举个例子
  1. for(int i=0;i<10;i++){
  2. }
复制代码
毫无疑问该语句块里面的i是局部变量。

总结:其实区分成员变量和局部变量,有一个很简单的办法,因为成员变量是成员的变量,也就是你可以通过“实例对象.成员名”来用(前提是该变量的访问权限不是私有private)。但是局部变量你这样用就笑大了。
回复 使用道具 举报
晨曦 发表于 2013-10-7 13:14
我来回答你吧:
1.但 Demo 类中的 变量 c 到底是成员变量还是局部变量?
答:是局部变量

谢谢,太详细了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马