黑马程序员技术交流社区

标题: java局部变量与成员变量区别总结,申请技术分 [打印本页]

作者: 耿文达    时间: 2013-2-3 19:14
标题: java局部变量与成员变量区别总结,申请技术分
本帖最后由 耿文达 于 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. }
复制代码



作者: 陈科宇    时间: 2013-2-3 20:22
朋友,你应该问问题才能得到技术分,而不是贴出你的总结。这种总结每本书书上都有,而且比你的要全面。
作者: 耿文达    时间: 2013-2-3 23:00
陈科宇 发表于 2013-2-3 20:22
朋友,你应该问问题才能得到技术分,而不是贴出你的总结。这种总结每本书书上都有,而且比你的要全面。 ...

呵呵,刚上论坛不久,还不是太熟悉规则,多谢你的提醒




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2