java局部变量与成员变量相关问题总结

java局部变量与成员变量相关问题总结

2013-02-03 12:39 156人阅读 评论(0) 收藏 举报

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

1. 定义

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

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

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

2. 详细分类

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

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

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

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

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

3. 初始化

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

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

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

4. 作用范围

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

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

5. 在内存中的位置

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

局部变量:在栈内存中。因为他不属于任何类或实例,因此他总是保存在其所在方法的栈内存中的。如果局部变量是基本类型的变量,则直接把这个变量的值保存在该变量对应的内存中;如果是引用类型的变量,则这个变量存放的是地址,通过该地址引用到该变量实际引用的对象或数组。

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

1. 引用

类变量:可以向前引用;

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

2. 归属及生命周期

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

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

与实例共存亡。

3. 空间分配

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

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

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

4. 存放位置

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

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

示例代码如下:

[java] view plaincopyprint?

  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. public void shout()
  10. {
  11. System.out.println("my name is " + name);
  12. }
  13. public void calculation(int num)//num为形参
  14. {
  15. int sum = 0;//sum为方法局部变量
  16. for(int i=0;i<=num;i++)//i为代码块局部变量
  17. {
  18. sum = sum + i;
  19. }
  20. System.out.println("the result is " + sum);
  21. }
  22. }
  23. class StaticDemo
  24. {
  25. public static void main(String[] args)
  26. {
  27. Person.country();//类可以直接访问类变量
  28. Person p = new Person();
  29. p.name = "zhagnsan";
  30. p.shout();
  31. p.calculation(100);
  32. }
  33. }
class Person
{
	String name;//实例变量
	static String country = "CN";//类变量

	public static void country()//静态成员函数
	{
		System.out.println("my country is " + country);
	}

	public void shout()
	{
		System.out.println("my name is " + name);
	}

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

		for(int i=0;i<=num;i++)//i为代码块局部变量
		{
			sum = sum + i;
		}

		System.out.println("the result is " + sum);
	}
}

class StaticDemo
{
	public static void main(String[] args)
	{
		Person.country();//类可以直接访问类变量
		Person p = new Person();
		p.name = "zhagnsan";
		p.shout();
		p.calculation(100);
	}
}

三、各变量的一些要点:

1. 成员变量的初始化和在内存中的运行机制:在类的准备阶段,系统将会为该类的类变量分配内存空间(堆内存),并制定默认初始值。初始化完成后,会在堆内存中分

配一块内存区。

2. 成员变量的考虑使用情形:

1)描述某个对象的固有信息的变量,例如人的身高;

2)保存某个类,或某个实例状态信息的变量;

3)如果某个信息需要在某个类的多个方法之间进行共享,则这个信息应该使用成员变量。

3. 当成员变量的作用域扩大到类存在范围或者对象存在范围,这种范围的扩大有两个害处:

1)增大了变量的生存时间,这将导致更大的系统开销;

2)扩大了变量的作用域,这不利于提高程序的内聚性。

4.java允许局部变量和成员变量同名,如果方法里的局部变量和成员变量同名,那么局部变量会覆盖成员变量,如果需要在这个方法里使用成员变量,那么需要this(对于

实例属性)或类名(对于类属性)作为调用者来限定访问这个成员变量。

5. 类变量也可以用该类的实例来访问:实例.类变量。 (这其实是一个假象,其实是类.类变量这样来访问) 也就是说,如果通过一个实例修改了类变量的值,由于这个类

变量并不属于它,而是属于它对应的类。因此,修改的依然是类的类变量,与通过该类来修改类变量的结果完全相同,这样导致该类的其他实例在访问这个类变量时也将获

得这个被修改过的值。

6. 三种局部变量的作用域:

1)形参:在整个方法内有效;

2)方法局部变量:从定义该变量的地方生效,到该方法结束时失效;

3)代码块局部变量:从定义该变量的地方生效,到该代码块结束时失效。

7. 在java中,一个方法里面不能定义两个同名的局部变量,即使一个是方法变量,一个是代码块变量或者形参也不行。

8. 形参的初始化过程:当通过类或对象调用某个方法时,系统会在该方法区内为所有形参分配内存空间,并将实参的值赋给对应的形参,这就完成了形参的初始化。

9. 成员变量在堆内存中,因为对象的存在,才在内存中存在;而局部变量存在于栈内存中;成员函数不在堆内存中,而是在java的方法区中,成员函数的局部变量在堆内存中。

四、栈内存和堆内存小结:

        1. 栈内存:某一个函数被调用时,这个函数会在栈内存里面申请一片空间,以后在这个函数内部定义的变量,都会分配到这个函数所申请到的栈。当函数运行结束时,分配给函数的栈空间被收回,在这个函数中被定义的变量也随之被释放和消失。

         2. 堆内存:通过new产生的数组和对象分配在堆内存中。堆内存中分配的内存,由JVM提供的GC(垃圾回收机制)来管理。在堆内存中产生了一个数组对象后,我们还可以在栈中定义一个变量,这个栈中变量的取值等于堆中对象的首地址。栈内存中的变量就成了堆内存中数组或者对象的引用变量。我们以后就可以在程序中直接使用栈中的这个变量来访问我们在堆中分配的数组或者对象,引用变量相当于数组或者对象起的一个别名,或者代号。
 
         五、引用变量:

          引用变量是一个普通的变量,定义时在栈中分配;引用变量在被运行到它的作用域之外时就被释放,而我们的数组和对象本身是在堆中分配的,即使程序运行到使用new产生对象的语句所在的函数或者代码之后,我们刚才被产生的数组和对象也不会被释放。数组和对象只是在没有引用变量指向它,也就是没有任何引用变量的值等于它的首地址,它才会变成垃圾不会被使用,但是它任然占据着内存空间不放(这也就是我们Java比较吃内存的一个原因),在随后一个不确定的时间被垃圾回收器收走。
} public void calculation(int num)//num为形参 { int sum = 0;//sum为方法局部变量 for(int i=0;i<=num;i++)//i为代码块局部变量 { sum = sum + i; } System.out.println("the result is " + sum); } } class StaticDemo { public static void main(String[] args) { Person.country();//类可以直接访问类变量 Person p = new Person(); p.name = "zhagnsan"; p.shout(); p.calculation(100); } }

三、各变量的一些要点:

1. 成员变量的初始化和在内存中的运行机制:在类的准备阶段,系统将会为该类的类变量分配内存空间(堆内存),并制定默认初始值。初始化完成后,会在堆内存中分

配一块内存区。

2. 成员变量的考虑使用情形:

1)描述某个对象的固有信息的变量,例如人的身高;

2)保存某个类,或某个实例状态信息的变量;

3)如果某个信息需要在某个类的多个方法之间进行共享,则这个信息应该使用成员变量。

3. 当成员变量的作用域扩大到类存在范围或者对象存在范围,这种范围的扩大有两个害处:

1)增大了变量的生存时间,这将导致更大的系统开销;

2)扩大了变量的作用域,这不利于提高程序的内聚性。

4.java允许局部变量和成员变量同名,如果方法里的局部变量和成员变量同名,那么局部变量会覆盖成员变量,如果需要在这个方法里使用成员变量,那么需要this(对于

实例属性)或类名(对于类属性)作为调用者来限定访问这个成员变量。

5. 类变量也可以用该类的实例来访问:实例.类变量。 (这其实是一个假象,其实是类.类变量这样来访问) 也就是说,如果通过一个实例修改了类变量的值,由于这个类

变量并不属于它,而是属于它对应的类。因此,修改的依然是类的类变量,与通过该类来修改类变量的结果完全相同,这样导致该类的其他实例在访问这个类变量时也将获

得这个被修改过的值。

6. 三种局部变量的作用域:

1)形参:在整个方法内有效;

2)方法局部变量:从定义该变量的地方生效,到该方法结束时失效;

3)代码块局部变量:从定义该变量的地方生效,到该代码块结束时失效。

7. 在java中,一个方法里面不能定义两个同名的局部变量,即使一个是方法变量,一个是代码块变量或者形参也不行。

8. 形参的初始化过程:当通过类或对象调用某个方法时,系统会在该方法区内为所有形参分配内存空间,并将实参的值赋给对应的形参,这就完成了形参的初始化。

9. 成员变量在堆内存中,因为对象的存在,才在内存中存在;而局部变量存在于栈内存中;成员函数不在堆内存中,而是在java的方法区中,成员函数的局部变量在堆内存中。

四、栈内存和堆内存小结:

        1. 栈内存:某一个函数被调用时,这个函数会在栈内存里面申请一片空间,以后在这个函数内部定义的变量,都会分配到这个函数所申请到的栈。当函数运行结束时,分配给函数的栈空间被收回,在这个函数中被定义的变量也随之被释放和消失。

         2. 堆内存:通过new产生的数组和对象分配在堆内存中。堆内存中分配的内存,由JVM提供的GC(垃圾回收机制)来管理。在堆内存中产生了一个数组对象后,我们还可以在栈中定义一个变量,这个栈中变量的取值等于堆中对象的首地址。栈内存中的变量就成了堆内存中数组或者对象的引用变量。我们以后就可以在程序中直接使用栈中的这个变量来访问我们在堆中分配的数组或者对象,引用变量相当于数组或者对象起的一个别名,或者代号。
 
         五、引用变量:

          引用变量是一个普通的变量,定义时在栈中分配;引用变量在被运行到它的作用域之外时就被释放,而我们的数组和对象本身是在堆中分配的,即使程序运行到使用new产生对象的语句所在的函数或者代码之后,我们刚才被产生的数组和对象也不会被释放。数组和对象只是在没有引用变量指向它,也就是没有任何引用变量的值等于它的首地址,它才会变成垃圾不会被使用,但是它任然占据着内存空间不放(这也就是我们Java比较吃内存的一个原因),在随后一个不确定的时间被垃圾回收器收走。
时间: 2024-10-08 11:13:36

java局部变量与成员变量相关问题总结的相关文章

【java基础】成员变量和局部变量

成员变量和局部变量 根据定义变量位置的不同,可以将变量分为成员变量和局部变量        成员变量是在类范围内定义的变量        局部变量是在一个方法内定义的变量   成员变量可以分为:        实例属性 (不用static修饰)               随着实例属性的存在而存在       类属性 (static修饰)               随着类的存在而存在   成员变量无需显式初始化,系统会自动对其进行默认初始化   局部变量可分为:        形参(形式参数)

记录JAVA学习的历程之关于局部变量与成员变量

最近一段时间开始学习JAVA,遇到了不少问题. 写下这些东西,纯粹为了记录自己的学习历程,借此激励自己,希望能在程序员的路上越走越远. 在JAVA中, 我们会遇到局部变量与成员变量这两个变量的分类, 这是按声明位置划分的,下面是对这两个变量的简单定义. 局部变量:方法或语句块内部定义的变量. 成员变量:方法外部,类的内部定义的变量. 更重要的一点是在局部变量中,JAVA不会默认初始化,必须自行初始化. 而在成员变量中,JAVA可自行初始化,初始化变量的值 我以图片的形式给大家浏览学习 以上只是我

Java类的成员变量和局部变量

在Java中,成员变量和局部变量存在较大的差异性.首先,我们来看一下变量的分类图: 成员变量 成员变量被分为:类属性和实例属性. 类属性:定义一个属性时,不使用static修饰的就是实例属性, 实例属性:定义一个属性时,使用static修饰的是类属性. 类属性从这个类的准备阶段起开始存在,直到系统完全销毁这个类,类属性的作用域与这个类的生存范围相同: 而实例属性则从这个类的实例被创建开始存在,直到系统完全销毁整个实例,实例属性的作用域与对应实例的生存范围相同. PS:一个类在使用之前,要经过类加

java 局部变量与成员成员变量的区别

package java04; /* 局部变量和成员变量的不同: 1.定义的位置不一样 局部变量:定义在方法内部 成员变量:在方法外部,直接写在类中 2.作用范围不一样 局部变量:只有方法中能使用,除了方法就不能用 成员变量:整个类都可以用 3.默认值不一样 局部变量:无默认值,先赋值在使用 成员变量:如果没有赋值有默认值 4.内存的位置不一样 局部变量:位于栈内存 成员变量:为于堆内存 5.生命周期不一样 局部变量:随着方法的进栈而诞生,随着方法出栈而消失 成员变量:随着对象的创建而诞生,随着

java中的成员变量,局部变量的理解

首先我们来理解什么是变量,依我来看,变量就是用来存放值的一个名字或者引用,比如年龄,性别,班级,学号,身份证号码等等.对于不同的对象当然有不一样数值.变量也有自己的属性,比如整数型,字符串类型,浮点型等等,基本数据类型和引用数据类型都可以.一个类里面有属性和方法,局部变量和成员变量的区别就输成员变量在类里面的作用区域是在整个类中使用.局部变量是指在方法里面的变量,作用域只在方法里面. 原文地址:https://www.cnblogs.com/yindong2019/p/11780599.html

C#面向过程之局部变量、成员变量、变量作用域、可变参数

局部变量与成员变量:  局部变量:定义在方法里面的变量就叫做局部变量:没有默认的初始值,使用变量之前必须给它赋值成员变量:定义在类下面的变量叫做成员变量:如果是数值类型默认初始值为0 如果是引用类型默认初始值为空 变量作用域: 范围 变量在那些范围可以访问到 在对应的大括号里面能访问 Console.WriteLine() Console.Out.WriteLine() 可变参数: params int [] arr arr为一个可变数组 可以给多个元素 也可以只给一个 也可以不给,若一个参数都

局部变量和成员变量的区别

变量的种类 根据定义位置的不同,我们给变量起了不同的名字.如下图所示: ? 在类中的位置不同  成员变量:类中,方法外 局部变量:方法中或者方法声明上(形式参数) 作用范围不一样  成员变量:类中 局部变量:方法中 初始化值的不同  成员变量:有默认值 局部变量:没有默认值.必须先定义,赋值,最后使用 在内存中的位置不同  成员变量:堆内存 局部变量:栈内存 生命周期不同  成员变量:随着对象的创建而存在,随着对象的消失而消失 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失 代码举例

局部变量和成员变量

哪些变量是局部变量? 方法体中定义的 变量 和 方法的 形式参数(方法声明中) 局部变量和成员变量的比较: 1. 在类中定义的位置不同 2. 在内存中的位置不同 局部变量: 存储在,方法对应栈空间的栈帧中的 成员变量: 存储在,堆空间中的对象的存储空间中 3. 生命周期不同 局部变量: 随着栈帧的创建而创建,随着栈帧的销毁而销毁 成员变量: 随对象的创建而创建,当对象变成垃圾的时候,对象中的成员变量对应的存储空间就会被销毁 4. 初始化值不同 局部变量: 初值,必须由程序员在使用局部变量之前赋予

《java中局部变量和成员变量的区别》

1 class Car 2 { 3 String color; 4 int number; 5 6 void run() 7 { 8 System.out.println(color+"::"+number); 9 } 10 } 11 12 class CarDemo 13 { 14 public static void main(String[] agrs) 15 { 16 Car c = new Car();//c是类类型的变量. 17 //c.color = "blue