A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© τ、高童鞋ゝ 中级黑马   /  2012-4-19 18:36  /  2528 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

静态变量和实例变量的区别
我知道在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
那在程序运行时他们有什么区别?能举个示例跟好

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

13 个回复

倒序浏览
1.类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。
而实例变量取决于类的实例。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。
2.在程序运行时的区别:
实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
      1、所属不同
    静态成员变量也称为类变量,它属于整个类,而且它多了一种调用方式直接用类名调用。
    实例变量,是被对象调用的,是所属具体对象的。
    2、生命周期不同
    静态成员变量是随着类的加载而加载的,也是随着类的消亡而消亡,生命周期与所属的类的生命周期一致
    实例变量随着对象的加载而加载,随着对象的消失而消失。按对象的生命周期存在。
    3、存储位置不同
    静态成员变量存储在方法区的静态方法区中
    实例变量存储对象所属堆内存中
    4、共享不同
    静态成员变量被所有的类对象所共享
    实例变量是对象中的特有数据  

这个论坛有帖子....

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

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

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

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
        public class VarTest
        {
                        public static int staticVar = 0;
                        public int instanceVar = 0;
                        public VariantTest()
                        {
                                staticVar++;
                                instanceVar++;
                                System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);
                        }
我这样写是不是static修饰的Var永远只分配一个staticVar变量,同时也创建了多个实例化对象?
回复 使用道具 举报
一: 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
二:
  java类的成员变量有两种:
  一种是被static关键字修饰的变量,叫类变量或者静态变量
    另一种没有static修饰,为实例变量
回复 使用道具 举报
本帖最后由 光sail 于 2012-4-19 21:19 编辑

static 关键字:可以用于修饰属性,也可以用于修饰方法,还可以用于修饰类.
static 修饰属性:无论一个类生成了多少个对象,所有这些对象共同使用唯 一一份静态的成员变量;一个对象对该静态成员变量进行了修改,其他对象的该静态成员变量的值也会随之发生变化。如果一个成员变量是static      那么我们可以通过类名.成员变量名的方式来使用它(推荐使用这种方式)。
static  修饰方法:static  修饰的方法叫做静态方法。对于静态方法来说,可以使用类名.方法名的方式来访问。
静态方法只能继承,不能重写(Override)。
  1. class StaticTest{
  2. static int i=9;
  3. public static void main(String[] args) {

  4. StaticTest st=new StaticTest();
  5. StaticTest st1=new StaticTest();
  6. st.add();
  7. st1.add();
  8. System.out.println(i);


  9. }
  10. public int add(){
  11. i++;
  12. return i;
  13. }
  14. }
复制代码
打印输出为11,st和st1对象共同拥有变量i。
回复 使用道具 举报
啊哦,版主...回答的好也是问的好啊,哈哈  ,厚脸皮一下···
回复 使用道具 举报
这么说吧,静态变量相当于共享属性,共有的,实例变量必须是创建对象后才有的
回复 使用道具 举报
静态变量是类所有的,也被称为类变量,被所有的实例对象所共享,而实例变量只是每个实例所拥有的!
回复 使用道具 举报
1、静态对象的数据在全局是唯一的,一改都改。如果你想要处理的东西是整个程序中唯一的,弄成静态是个好方法。
2、非静态的东西你修改以后只是修改了他自己的数据,但是不会影响其他同类对象的数据。
3、静态对象和非静态对象都是对象,是对象都是要实例化的。不同之处就是2者的数据表现和存储方式不一样。
4、静态的好处:
引用方便。对于公用类型的变量,直接用 类名.静态方法名  或者  类名.静态变量名就可引用并且直接可以修改其属性值,不用getter和setter方法。
保持数据的唯一性。此数据全局都是唯一的,修改他的任何一处地方,在程序所有使用到的地方都将会体现到这些数据的修改。
有效减少多余的浪费。
回复 使用道具 举报
τ、高童鞋ゝ 发表于 2012-4-19 18:53
public class VarTest
        {
                        public static int staticVar = 0;

静态变量属于类,加载类的时候就会被分配内存空间,在内存中只有一份拷贝,每创建一个实例对象,staticVar将加1.
实例变量属于实例对象,只有在创建了实例对象之后才会被分配内存空间,无论创建多少个实例对象,instanceVar的值只加1一次,为1.
回复 使用道具 举报
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那块的基础视频吧,很详细。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马