静态变量与实例变量

静态变量与实例变量

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

 

### 静态变量实例变量的区别 #### 定义作用范围 - **静态变量**:属于类本身,也称为类变量。在类加载时被分配内存,存储于方法区中[^5]。静态变量在整个程序运行期间都存在,可以通过类名直接访问,无需创建对象[^2]。 - **实例变量**:属于具体的对象实例,也称为非静态变量。只有在创建对象时才会为实例变量分配内存,存储于堆中[^5]。每个对象都有自己独立的实例变量副本,必须通过对象实例来访问和修改[^3]。 #### 内存分配生命周期 - 静态变量在类加载时分配内存,存在于方法区中,其生命周期伴随整个程序的运行。即使没有创建任何对象,静态变量也可以被访问。 - 实例变量的内存分配依赖于对象的创建过程,存在于堆中。当对象被销毁时,实例变量也随之消失。 #### 访问方式 - 静态变量可以通过类名直接访问,例如`ClassName.staticVariable`[^2]。 - 实例变量需要通过对象实例访问,例如`objectName.instanceVariable`[^3]。 #### 共享性独立性 - 静态变量是所有对象共享的,无论创建多少个对象,静态变量只有一份拷贝。 - 每个对象都有自己独立的实例变量副本,改变一个对象的实例变量不会影响其他对象的相应变量[^3]。 #### 示例代码 以下是一个Java示例,展示了静态变量实例变量的定义使用: ```java class Counter { static int count = 0; // 静态变量 int value; // 实例变量 public Counter() { count++; // 每次创建对象时,静态变量count自增 value = count; // 每个对象的实例变量value等于当前count值 } public void display() { System.out.println("Count: " + count + ", Value: " + value); } public static void main(String[] args) { Counter c1 = new Counter(); c1.display(); // 输出 "Count: 1, Value: 1" Counter c2 = new Counter(); c2.display(); // 输出 "Count: 2, Value: 2" System.out.println("Static variable accessed via class name: " + Counter.count); // 输出 "Static variable accessed via class name: 2" } } ``` #### 区别总结 | 特性 | 静态变量 | 实例变量 | |--------------------|-----------------------------|-----------------------------| | 所属 | 类 | 对象 | | 内存分配时间 | 类加载时 | 对象创建时 | | 生命周期 | 程序运行期间 | 对象存在期间 | | 存储位置 | 方法区 | 堆 | | 访问方式 | 类名.静态变量名 | 对象名.实例变量名 | | 共享性 | 所有对象共享 | 每个对象独立拥有 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值