Java中static修饰符

来源:互联网 发布:工期优化例题 编辑:程序博客网 时间:2024/05/02 02:11

Java中static修饰符
java类的成员变量有俩种:一种是被static关键字修饰的变量,叫类变量或者静态变量;另一种没有static修饰,为实例变量。
  在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
  在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
使用static修饰符来修饰类的成员变量和方法,使他们成为静态成员,也称为类成员。静态成员存储于类的存储区,属于整个类,不属于一个具体的类对象。因此,在不同的类对象中访问静态成员,访问的是同一个。成员声明为static后,无须创建该类中任何对象,直接用类就可以访问。同样,静态方法也可以直接被调用。如果不想再创建对象的时候就需要知道一些相关信息,那么就声明为static类型的,被修饰为static类型的成员变量不属于对象,它是属于类的。
内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。
  而实例变量取决于类的实例。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。
方法声明为static时,具体有如下限制:
1 只能调用其他static方法和使用static属性。
2 不能使用关键字this或super
3 static代码块将被只执行一次。
例1:
public class test
{
      String color=”绿色”;
      public static void main(String[]  args)
      {
           System.out.println(color);//程序从main入口,color属于实例变量,为对象共//有,在还没有创建对象就调用它,所以编译出错
      }
}
此时使用javac编译程序时将产生一个和该程序对应的class程序,然后使用java运行编译产生的class程序,运行出现异常。原因就是在static类型的方法里调用未使用static类型的成员变量color。将成员变量color修饰为static类型的就可以解决上述错误。
此时输出的结果为:绿色

总结:

程序里的main方法为一个static类型的静态方法,如果要使用color成员变量的话,该变量就要被修饰为static类型的。静态变量不依赖于对象的加载而是依赖于类的加载的。当类加载后对象可能还没有被加载,所以说静态成员变量是属于类的,其生命周期比非静态成员变量要长。在静态方法里只能使用静态成员变
例2:
public class test
{
      static String color=”绿色”;
public void getMes()
{
  System.out.println(test.color);
}
      public static void main(String args[])
      {
           test t=new test();
           t.getMes();
      }
}
此时输出的结果为:绿色

方法getMes里调用了静态成员变量color,为什么在这里不提示错误呢?这是因为getMes是属于对象的,对象存在了该方法就存在了。在方法getMes存在的时候静态成员变量早就已经存在了。在任何静态方法里凑能访问静态成员变量了。
例3:
public class test
{
      static String color=”绿色”;
      public static void main(String args[])
      {
           System.out.println(this.color);
      }
}
此时会产生错误。因为this关键字指的是类的本身,是属于对象的,而静态成员变量是属于类的。它们之间的访问关系不一样。对象存在的时候静态成员变量一定存在,但this不知道指的是哪个对象;而静态成员变量存在的时候对象不一定存在。
所谓常量指的就是唯一的、不可变的、只存在一份的数据。在Java里,用static final两个关键字来修饰成员变量。
static关键字修饰成员变量是属于类,随着类的创建而创建。
final关键字修饰成员变量的值是不能改变的。
static关键字和final关键字没有前后顺序之分。
public class test
{
     public final static String color=”绿色”;
public final static double PI;
      public static void main(String args[])
      {
           System.out.println(color);

System.out.println(PI);
      }
}
此时提醒错误,错误的提示说明常量PI必须要初始化,因为static关键字的关系要在对象创建前对其进行初始化。对常量PI进行初始化赋值就可以解决这个问题。
public class test
{
      //次为一个静态块
     static
{
           PI=3.14;
}
public final static String color=”绿色”;
public final static double PI;
      public static void main(String args[])
      {
           System.out.println(color);
System.out.println(PI);
      }
}
此时运行的结果是:绿色
                             3.14
静态块和静态成员变量一样都属于类的,不属于对象的。常量和静态块随着类的创建在,当然可以给常量进行赋值。
注意,static静态块在类的初始化就自动运行,而static修饰方法只有被调用才会运行

public class Test
{
    static String color="绿色";
    public static void print(){
     System.out.println("static修饰方法");
    }
    static{
     System.out.println("static静态方法块");
    }
    public static void main(String args[])
    {
         System.out.println(color);
    }
}
输出结果
 static静态方法块
绿色
程序在main函数入口判断该类是否被装卸,如果没有,则装卸该类,故而“static静态方法块”在“绿色”前。

0 0
原创粉丝点击