欢迎使用CSDN-markdown编辑器

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
补充:
静态变量static是一个公共变量,无论哪个对象改变了它的值,对其他所有该类对象都有效。静态变量的一个重要作用是当作同类各个对象之间传递信息使用,类似于C语言中的全局变量。但这样破坏了数据的封装原则,往往会留下隐患,所以使用这类变量时需要万分谨慎。
静态变量的另一个用途是定义静态常量,比如:

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

文一:
  在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
  在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,
静态变量则可以直接使用类名来引用。
  例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个static Var变量,并且每创建一个实例对象,这个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);
      
     }
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值