当前位置导航:炫浪网>>网络学院>>编程开发>>JAVA教程>>Java入门

Java编程那些事儿65——static修饰符

Java编程那些事儿系列文章(全集目录)

    8.7 修饰符

    修饰符的作用是让被修饰的内容具备特定的功能,在程序中合理使用修饰符可以在语法和功能上实现很多需要的效果。Java语言中的修饰符主要有5个:static、final、native、abstract和synchronized.这里首先讲解static、final和native的作用。

    8.7.1 static修饰符

    static关键字的中文意思是静态的,该修饰符可以修饰成员变量,成员常量和成员方法。使用该关键字修饰的内容,在面向对象中static修饰的内容是隶属于类,而不是直接隶属于对象的,所以static修饰的成员变量一般称作类变量,而static修饰的方法一般称作类方法。另外,static还可以修饰代码块,下面进行详细的介绍。

    8.7.1.1 静态变量

    static修饰的变量称作静态变量。静态变量和一般的成员变量不同,一个类在加载到内存时,静态变量只初始化一次,也就是说所有对象的静态变量在内存中都只有一个存储位置,每个对象中的静态变量都指向内存中同一个地址,它是在所有的对象之间共享的数据。另外静态变量在引用时比较方便。所以一般在需要实现以下两个功能时使用静态变量:

    l  在对象之间共享值时

    l  方便访问变量时

    下面首先说一下非静态变量(没有static修饰符修饰的成员变量)在内存中如何存储的。示例代码如下:

     //文件名Box.java
     public class Box{
          int length;
          int width;
          int height;
          public Box(int l,int w,int h){
              length = l;
              width = w;
              height = h;
          }
     }
     //文件名TestBox.java
     public class TestBox{
          public static void main(String[] args){
              Box a = new Box(10,20,30);
              Box b = new Box(40,20,10);
          }
     }

    则对象a和对象b在内存中的存储格式如下图所示:

    从上面的图可以看出,非静态变量的值在每个对象中都有独立的存储空间,不同对象间这些值之间没有管理,也就是说每个对象都为内部的每个非静态的变量分配独立的存储空间,所以每个对象中非静态变量是隶属于对象,也就是说在每个对象中可能是不同的。

    简单介绍了非静态变量在对象中的存储以后,下面再来看一下静态变量是如何进行存储的。示例代码如下:

         //文件名StaticVar.java

         public class StaticDemo{

                   static int m;

                   int n;

                   char c;

         }

         //文件名TestStaticVar.java

         public class TestStaticVar{

                   public static void main(String[] args){

                            StaticVar sv1 = new StaticVar();

                            StaticVar sv2 = new StaticVar();

                   }

         }

    则对象sv1和对象sv2在内存中存储的格式如下图所示:

    对于StaticDemo类型的对象sv1和sv2来说,由于使用默认的构造方法进行构造,所以每个成员变量都被初始化为对应数据类型的默认值,int的默认值为0,char的默认值为编号为0的字符,所以sv1和sv2对象中存储的值如上图所示。

    而静态变量的存储和非静态变量的存储不同,在Java虚拟机内部,第一次使用类时初始化该类中的所有静态变量,以后就不再进行初始化,而且无论创建多少个该类的对象,静态变量的存储在内存中都是独立于对象的,也就是Java虚拟机单独为静态变量分配存储空间,所以导致所有的对象内部的静态变量在内存中存储时只有一个空间。这样就导致使用任何一个对象对该值的修改都是使该存储空间中的值发生改变,而其它对象在后续引用时就跟着发生了变化。静态变量就是使用这样的方式在所有的对象之间进行数值共享的。

    静态变量在实际使用时,可以通过只存储一次来节约存储空间,这个特性导致在类内部定义的成员常量一般都做成静态的,因为常量的值在每个对象中都是相同的,而且使用static修饰也便于对成员常量的引用。

    在类外部访问某类中静态变量(常量)的语法格式为:

    类名.成员变量(常量)

    例如:

    StaticDemo.m

    这样方便对于成员变量的访问。当然,语法上也不禁止使用:对象。成员变量,这样的语法格式进行访问,但是一般不推荐这样使用,而且有些类是无法创建对象的。

    注意:static关键字不能修饰成员方法或构造方法内部的变量。

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接