静态变量与实例变量

时间:2021-10-08 06:30:39

静态变量与实例变量

1.存储区域不同:静态变量存储在静态存储区,普通变量存储在堆中;
2.静态变量与类相关,普通变量则与实例相关,说细一点:
class Demo {
public static String a;
public String b;
public static void main(String[] args) {
   Demo d = new Demo();
   d.a; // 警告,虽然可以通过编译,但没有意义
   d.b; // 正确
   Demo.a; // 对static变量的正确引用
   Demo.b; // 错误
}
3.内存分配方式不同。static字段对每个类来说都只有一份,无论你创建多少对象,该static区域都只有一份,它对于这些对象来说是共享的;而非static字段,因为其从属于对象,因此每

有一个对象,就会为该变量申请一个存储空间;
4.生命周期不同。从程序运行开始,static域就已经确定下来,因此在没有创建对象之前,就可以引用该区域变量及函数,而非static域的变量及函数,必须等实例化之后才可以通过对象来

调用。
5.理解了this之后,更能体会到static的含义。static方法就是没有this的方法,这也就是为什么在static方法中不能引用非static变量,因为该方法内没有隐含的this,编译器无从知道这

个变量是属于哪一个类的。
=================
java类的成员变量有俩种:

一种是被static关键字修饰的变量,叫类变量或者静态变量

另一种没有static修饰,为实例变量

类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于

类的生命周期。

而实例变量取决于类的实例。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。


public class Temp {

int t; //实例变量

public static void main(String args[]){

int t=1; //局部变量

System.out.println(t); //打印局部变量

Temp a= new Temp(); //创建实例

System.out.println(a.t); //通过实例访问实例变量

}

}

 

结果为:

1

0 (成员变量具有缺省值 而局部变量则没有)

把代码改为


public class Temp {

static int t; //类变量

public static void main(String args[]){

System.out.println(t); //打印类变量

int t=1; //局部变量

System.out.println(t); //打印局部变量

Temp a= new Temp(); //创建实例

System.out.println(a.t); //通过实例访问实例变量

}

}

 

结果则为

0

1

0

补充:

静态变量stat是一个公共变量,无论哪个对象改变了它的值,对其他所有该类对象都有效。静态变量的一个重要作用是当作同类各个对象之间传递信息使用,类似于C语言中的全局变量。但这

样破坏了数据的封装原则,往往会留下隐患,所以使用这类变量时需要万分谨慎。

静态变量的另一个用途是定义静态常量,比如:


public static double PI = 3.1415926;

这样的静态常量可以无需创建对象就直接使用,省略了创建对象的步骤,类似于C语言中用define定义的常量。这样定义常量,不仅使用方便,而且节省内存空间。在JDK中,存在着大量的这

种静态常量。
===============
文一:

  在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。

  在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所

以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,

静态变量则可以直接使用类名来引用。

  例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个staticVar变量,并且每创建一个实例对象,这个staticVar 就会加1;但是,每创建一个实例对象,就会分配一

个instanceVar,即可能分配多个instanceVar,并且每个instanceVar的值都只自加了1次。

  public class VariantTest

  {

  public static int staticVar = 0;

  public int instanceVar = 0;

  public VariantTest()

  {

  staticVar++;

  instanceVar++;

  System.out.println("staticVar = "++staticVar ", instanceVar = " ++instanceVar);

  }

  }

  文二:

  java类的成员变量有俩种:

  一种是被static关键字修饰的变量,叫类变量或者静态变量

  另一种没有static修饰,为实例变量

  类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取

决于类的生命周期

而实例变量取决于类的实例。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。

  public class Temp {

  int t; //实例变量

  public static void main(String args[]){

  int t=1; //局部变量

  System.out.println(t); //打印局部变量

  Temp a= new Temp(); //创建实例

  System.out.println(a.t); //通过实例访问实例变量

  }

  }

  结果为:

  1

  0 (成员变量具有缺省值 而局部变量则没有)

  把代码改为

  public class Temp {

  static int t; //类变量

  public static void main(String args[]){

  System.out.println(t); //打印类变量

  int t=1; //局部变量

  System.out.println(t); //打印局部变量

  Temp a= new Temp(); //创建实例

  System.out.println(a.t); //通过实例访问实例变量

  }

  }

  结果则为

  0

  1

  0