静态变量与实例变量

news/2024/7/5 10:36:21

静态变量与实例变量

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

 


http://www.niftyadmin.cn/n/3978532.html

相关文章

java中static变量和方法的总结

java中static变量和方法的总结 java中一切皆是对象 一个类中对象的定义一般都是分一下的两步来进行的:1/ A a; //定义了一个类A的引用2/ anew A("10","2563"); //真正地建立了对象a&#x…

Java/JSP中文乱码问题解决

Java/JSP中文乱码问题解决 自从接触Java和JSP以来,就不断与Java的中文乱码问题打交道,现在终于得到了彻底的解决,现将我们的解决心得与大家共享。 一、Java中文问题的由来 Java的内核和class文件是基于unicode的,这使Java程序具…

JAVA简单考试题

JAVA考试题一、 填空题:(15个2)1、 面向对象的特征有(至少写出三个): 封装、继承、多态 2、 Map采用 哈希算法 机制放置数据。3、 …

Collection接口和Map接口的主要实现类

Collection接口和Map接口的主要实现类 Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java …

在Linux下使用MySQL简介

在Linux下使用MySQL简介一、安装Mysql1、下载MySQL的安装文件安装MySQL需要下面两个文件:MySQL-server-4.0.16-0.i386.rpm   MySQL-client-4.0.16-0.i386.rpm下载地址为:http://www.mysql.com/downloads/mysql-4.0.html,打开此网页&#x…

三道编程题

四、 编程题1. 构造一个类来描述屏幕上的一个点,该类的构成包括点的x和y两个坐标,以及一些对点进行的操作,包括:取得点的坐标值,对点的坐标进行赋值,编写应用程序生成该类的对象并对其进行操作。 2. 编写…

海信的笔试题

数字推理题和逻辑推导题(供参考) 一:数字推理 答题说明:请对题项中给出的数列进行观察和分析,并根据其排列规律推导出空缺位置上的数字,做出选择,测试时间15分钟。 第1题:1, 3, 3, 9, ( ) A.18 B.21 C.27 D.81 第2题:在面积相等的…

UML 实践——用例图、顺序图、状态图、类图、包图、协作图

文章分类:综合技术 UML 实践——用例图、顺序图、状态图、类图、包图、协作图 面向对象的问题的处理的关键是建模问题。建模可以把在复杂世界的许多重要的细节给抽象出。许多建模工具封装了UML(也就是Unified Modeling Language™),这篇课程的…