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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 耿文达 于 2013-2-3 19:24 编辑

学习过程中对局部变量和成员变量的区别有点模糊,因此查了很多资料,并根据自己的粗浅理解编了一段示例代码,分享给大家,希望能起到抛砖引玉的作用,还请大牛们能更正和补充,以完善这一主题:

一、Java中的所有变量可以分成局部变量和成员变量。他们的区别:


1. 定义


成员变量:在类体里面定义的变量称为成员变量;


局部变量:形参、方法、代码块中定义的变量,都属于局部变量。


          (注:局部变量定义必须在方法里面!)


2. 详细分类


成员变量:1)类变量(静态变量)——有static修饰;


          2)实例变量(非静态变量)——没有static修饰。


局部变量:1)形参——方法签名中定义的变量;


          2)方法局部变量——在方法(函数)内定义;


          3)代码块局部变量——在代码块内定义(例如for循环里面的变量)。


3. 初始化


成员变量:无需显式初始化,只要为一个类定义了类变量或实例变量,则系统会在这


          个类的准备阶段或创建这个类的实例时进行默认初始化。


局部变量:除了形参之外,都必须显式初始化。


4. 作用范围


成员变量:作用于整个类中;


局部变量:作用于方法(函数)中,或者语句中。


5. 在内存中的位置


成员变量:在堆内存中。因为类或对象的存在,才在内存中存在;


局部变量:在栈内存中。因为他不属于任何类或实例,因此他总是保存在其所在方法                                                   


          的栈内存中的。如果局部变量是基本类型的变量,则直接把这个变量的值


          保存在该变量对应的内存中;如果是引用类型的变量,则这个变量存放的


          是地址,通过该地址引用到该变量实际引用的对象或数组。





二、类变量和实例变量的区别:


1. 引用


类变量:可以向前引用;


实例变量:不可以向前引用,如果向前引用,则成为非法向前引用。


2. 归属及生命周期


类变量:属于类本身。可以理解为类成员变量。它作为类的一个成员,与类共存亡;


实例变量:属于类的实例对象。可以理解为实例成员变量。它作为实例的一个成员,


          与实例共存亡。


3. 空间分配


类变量:不依赖类的实例,只在初始化时在栈内存中被分配一次空间。无论类的实例


        被创建几次,都不再为类变量分配空间;


实例变量:在创建实例时分配内存空间


4. 存放位置


类变量:随着类的加载而存在于方法区中;


实例变量:随着对象的建立而存在于堆内存中。



示例代码如下:

  1. class Person
  2. {
  3.         String name;//实例变量
  4.         static String country = "CN";//类变量

  5.         public static void country()//静态成员函数
  6.         {
  7.                 System.out.println("my country is " + country);
  8.         }
  9.         
  10.         public void shout()
  11.         {
  12.                 System.out.println("my name is " + name);
  13.         }

  14.         public void calculation(int num)//num为形参
  15.         {
  16.                 int sum = 0;//sum为方法局部变量

  17.                 for(int i=0;i<=num;i++)//i为代码块局部变量
  18.                 {
  19.                         sum = sum + i;
  20.                 }
  21.                
  22.                 System.out.println("the result is " + sum);
  23.         }
  24. }

  25. class StaticDemo
  26. {
  27.         public static void main(String[] args)
  28.         {
  29.                 Person.country();//类可以直接访问类变量
  30.                 Person p = new Person();
  31.                 p.name = "zhagnsan";
  32.                 p.shout();
  33.                 p.calculation(100);
  34.         }
  35. }
复制代码


评分

参与人数 1黑马币 +6 收起 理由
黄锦成 + 6 鼓励一下

查看全部评分

2 个回复

正序浏览
陈科宇 发表于 2013-2-3 20:22
朋友,你应该问问题才能得到技术分,而不是贴出你的总结。这种总结每本书书上都有,而且比你的要全面。 ...

呵呵,刚上论坛不久,还不是太熟悉规则,多谢你的提醒
回复 使用道具 举报
朋友,你应该问问题才能得到技术分,而不是贴出你的总结。这种总结每本书书上都有,而且比你的要全面。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马