成员变量、全局变量、实例变量、类变量、静态变量和局部变量的区别

avatar 2017年11月03日18:07:15 6 3036 views
博主分享免费Java教学视频,B站账号:Java刘哥 ,长期提供技术问题解决、项目定制:本站商品点此
变量名首写字母使用小写,如果由多个单词组成,从第2个单词开始的其他单词的首写字母使用大写。

如果局部变量的名字和成员变量的名字相同, 要想在该方法中使用成员变量,必须使用关键字this


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


成员变量:

1、成员变量定义在类中,在整个类中都可以被访问。

2、成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。

  3、成员变量有默认初始化值。

局部变量:

1、局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。

2、局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。

3、局部变量没有默认初始化值 

在使用变量时需要遵循的原则为:就近原则

首先在局部范围找,有就使用;接着在成员位置找。



成员变量(俗称全局变量,不区分static),又分为两种
  • 实例变量
  • 类变量(static静态变量)




通过一段代码我们便能区分 静态变量(类变量),实例变量 和 局部变量 三者的区别
  1. public class Demo {
  2.     /**
  3.      * 成员变量(俗称全局变量),//有缺省值为0
  4.      *      静态变量(也称类变量),带static的
  5.      *      实例变量,不带static的
  6.      * 局部变量 //无缺省值,需要初始化
  7.      */
  8.     static int x; //类变量,有缺省值为0
  9.     int y ;//示例变量
  10.     public static void main(String args[]) {
  11.         System.out.println(x);//访问类变量,值=0
  12.         int x=5;//局部变量,必须初始化
  13.         System.out.println(x);//访问局部变量,值=5
  14.         Demo demo = new Demo();//创建实例
  15.         System.out.println(demo.y);//通过实例访问实例变量,值=0
  16.     }
  17. }

其中成员变量(静态变量+实例变量)是有缺省值的,即默认值=0;而局部变量没有。


静态变量


是一个修饰符,用于修饰成员(成员变量和成员函数)。

特点:

1、想要实现对象中的共性数据的对象共享。可以将这个数据进行静态修饰。

2、被静态修饰的成员,可以直接被类名所调用。也就是说,静态的成员多了一种调用方式。类名.静态方式。

3、静态随着类的加载而加载。而且优先于对象存在



弊端:

1、有些数据是对象特有的数据,是不可以被静态修饰的。因为那样的话,特有数据会变成对象的共享数据。这样对事物的描述就出了问题。所以,在定义静态时,必须要明确,这个数据是否是被对象所共享的。

2、静态方法只能访问静态成员,不可以访问非静态成员。

因为静态方法加载时,优先于对象存在,所以没有办法访问对象中的成员。

3、静态方法中不能使用this,super关键字。

因为this代表对象,而静态在时,有可能没有对象,所以this无法使用。



什么时候使用静态变量?

在程序运行期间,类中的静态变量其内存空间对所有该类的实例是共享的,因此在某些时候,为了节省内存空间开销,共享资源, 我们可以将类中的变量声明为静态变量。

但是因为静态变量生命周期太长,并且不易被系统回收,所有如果使用不合理,就会适得其反,从而造成大量内存的浪费。

因此建议在全部符合下列条件的情况下才使用静态变量:

(1)变量所包含的对象体积较大,占用内存较多

(2)变量所包含的对象生命周期较长

(3)变量所包含的对象数据稳定

(4)该类的实例 有 对该变量包含对象的共享需求


作用域问题


1. 类的静态变量在内存中只有一个。静态变量位于方法区,被类的所有实例共享。静态变量的生命周期取决于类的生命周期(即类何时被加载和卸载)。

2. 类的每个实例都有相应的实例变量。实例变量位于堆区中。实例变量的生命周期取决于实例的生命周期(即实例何时被创建及销毁)。

3. 假如成员变量(包括静态变量和实例变量)是引用变量,那么当该成员变量结束生命周期时,并不意味着它所引用的对象也一定结束生命周期。变量的生命周期
和对象的生命周期是两个不同的概念。

4. 局部变量位于栈区,其生命周期取决于所属的方法何时被调用及结束调用。



总结一下:

局部变量位于栈区,静态变量位于方法区,实例变量位于堆区,方法的字节码位于方法区,对象本身位于堆区,对象的引用位于栈区。

顺便配张图





  • 微信
  • 交流学习,资料分享
  • weinxin
  • 个人淘宝
  • 店铺名:言曌博客咨询部

  • (部分商品未及时上架淘宝)
avatar

发表评论

avatar 登录者:匿名
匿名评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0