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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yangfengxiao 中级黑马   /  2012-9-29 10:55  /  2134 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 yangfengxiao 于 2012-9-29 17:15 编辑

关于成员变量和局部变量

谁的生命周期长,优先使用谁

使用有什么注意事项吗?

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
下面我举例为你说明一下,希望对你能有帮助:
public class Person
{
//定义一个实例属性
public String name;
//定义一个类属性
public static int eyeNum;
}
public class TestPerson
{
public static void main(String[] args)
{
  //Person类已经加载,则eyeNum变量起作用了,输出0
  System.out.println("Person的eyeNum类属性值:" + Person.eyeNum);
  //创建Person对象
  Person p = new Person();
  //通过Person对象的引用p来访问Person对象name实例属性
  //并通过实例访问eyeNum类属性
  System.out.println("p变量的name属性值是:" + p.name
   + " p对象的eyeNum属性值是:" + p.eyeNum);
  //直接为name实例属性赋值
  p.name = "孙悟空";
  //通过p访问eyeNum类属性,依然是访问Person的eyeNum属性
  p.eyeNum = 2;
  //再次通过Person对象来访问name实例属性和eyeNum类属性
  System.out.println("p变量的name属性值是:" + p.name
   + " p对象的eyeNum属性值是:" + p.eyeNum);
  //前面通过p修改了Person的eyeNum属性,此处的Person.eyeNum将输出2
  System.out.println("Person的eyeNum类属性值:" + Person.eyeNum);
  Person p2 = new Person();
  //p2访问的eyeNum类属性依然引用Person类的,因此依然输出2
  System.out.println("p2对象的eyeNum类属性值:" + p2.eyeNum);
}
}

public class TestBlock
{
public static void main(String[] args)
{
  {
   //定义一个代码块局部变量a
   int a;
   //下面代码将出现错误,因为a变量还未初始化
   //System.out.println("代码块局部变量a的值:" + a);
   //为a变量赋初始值,也就是进行初始化
   a = 5;
   System.out.println("代码块局部变量a的值:" + a);
  }
  //下面试图访问的a变量并不存在
  //System.out.println(a);
}
}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这个解释还真不太好解释,因为程序员之间最容易沟通的就是代码:下面我通过一小段代码来说明吧:
public class T{
public String name;  //定义了两个成员变量,是属于T实例化出来的对象的
public int   age;//
public void show(){
  int  x=10;//此时int x=10就是局部变量,是在一个方法内的


}
//

}
因为我也是菜鸟,水平有限,这只是我自己的理解,仅供参考!还希望楼主多看毕老师的视频,多记笔记。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
代码位置:
成员变量存在与类中,是类的成员。
局部变量作为代码块成员、方法成员,存在于方法定义和参数列表上。

内存位置:
成员变量存在于堆中。
局部变量存在与栈中。

初始化:
成员变量作为类的成员,初始化比较早,成员变量默认初始化后,在显示初始化,接下来才是构造对象。
局部变量作为代码块和方法的成员,如果代码块是静态的,局部变量就比成员变量初始化早,
如果是非静态的,就要比成员变量初始化晚。局部变量必须被程序员初始化。

修饰:
成员变量可以被static,public,protect,private修饰。
局部变量不可以被上述修饰符修饰。
成员变量和局部变量都可以定义final。

总结:
局部变量在方法和代码块被执行时创建,结束时销毁。而成员变量存在于这个类的执行期中。
通常情况下,成员变量生命期要长于局部变量。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
李建强 发表于 2012-9-29 11:27
代码位置:
成员变量存在与类中,是类的成员。
局部变量作为代码块成员、方法成员,存在于方法定义和参数列 ...

谢了。。。。
回复 使用道具 举报
这是我自己当时听视频时候做的笔记,你参考下:

成员变量 和 局部变量 区别

   (1)成员变量:
            成员变量定义在类中,在整个类中都可以被访问
            成员变量随对象的建立而建立,存在于对象所在的堆内存中
            成员变量可以被成员修饰符public、private、static等修饰
            成员变量有默认初始化值
   (2)局部变量:
            局部变量只定义在函数和语句中
            局部变量存在于栈内存中
            作用的范围结束,变量空间会自动释放
            局部变量没有默认初始化值

   我的理解:作用范围不一样,调用顺序也有先有后,看情况而定了,不一定成员变量就一定比局部变量生命周期长,虽说局部变量在语句和函数中,但不排除调用完成员变量再调用局部变量的可能,而且有些成员变量是在对象建立的时候才加载的,等于为对象而存在,不建立不加载,这样就没有生命周期的可比性了。

   如有不对的地方,望谅解!希望对你有帮助!

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
程序员能有这样的平台交流,很好
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马