求问:
1. Java中static变量有什么作用?一般用在什么场合? 
2. static 方法中能调用非static变量吗?
3. 全局static变量在什么时候初始化? 是调用构造函数之前? 究竟有多前?
谢谢!

解决方案 »

  1.   

    静态方法可以直接用类名.方法名 
    静态属性可以直接用类名.属性名  不用再new 一个对象出来, 
    这是在本类中的.在别的类中用的话 要写成public的. 
    后面那2个我确定下再跟你讲
      

  2.   

    1 不能被重新初始化
    2  变量或static修饰的属性或方法,其他属性或方法不可以。
    具体的
      

  3.   

    有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main() ,所以它被声明为static。 声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。声明为static的方法有以下几条限制: ◆它们仅能调用其他的static 方法。 
    ◆它们只能访问static数据。 
    ◆它们不能以任何方式引用this 或super package com.birdme;public class UseStatic {    /**     * @param args     */    private static int s;        public UseStatic(){        System.out.println("Create new Class");    }    static {        System.out.println("static block initialized");    }        public int getStatic(){        return s;    }    public void  setStatic(int i){        s=i;    }        public static void main(String[] args) {        // TODO Auto-generated method stub        UseStatic classA= new UseStatic();        UseStatic classB= new UseStatic();        System.out.println("classA.s="+classA.getStatic()+";classB.s=                 "+classB.getStatic());        classA.setStatic(10);        System.out.println("classA.s="+classA.getStatic()+";classB.s=                 "+classB.getStatic());        classB.setStatic(classB.getStatic()+10);        System.out.println("classA.s="+classA.getStatic()+";classB.s=                 "+classB.getStatic());    }}
     
    下面是该程序的输出: static block initializedCreate new ClassCreate new ClassclassA.s=0;classB.s=0classA.s=10;classB.s=10classA.s=20;classB.s=20
     
    从结果可以看出类中static块程序是在类被装载的时候开始执行。而不是在创建对象的时候执行。
      

  4.   

    static static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。 被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。 用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。 static 变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。 static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:
    类名.静态方法名(参数列表...)
    类名.静态变量名 用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块(用处非常大,呵呵)。1、static变量
     按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是:
     对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
     对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。2、静态方法
     静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法 (就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!这个需要去理解,想明白其中的道理,不是记忆!!!
     因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。3、static代码块
     static 代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。例如:public class Test5 {
    private static int a;
    private int b;static{
    Test5.a=3;
    System.out.println(a);
    Test5 t=new Test5();
    t.f();
    t.b=1000;
    System.out.println(t.b);
    }
    static{
    Test5.a=4;
    System.out.println(a);
    }
    public static void main(String[] args) {
    // TODO 自动生成方法存根
    }
    static{
    Test5.a=5;
    System.out.println(a);
    }
    public void f(){
    System.out.println("hhahhahah");
    }
    }
    运行结果:
    3
    hhahhahah
    1000
    4
    5 利用静态代码块可以对一些static变量进行赋值,最后再看一眼这些例子,都一个static的main方法,这样JVM在运行main方法的时候可以直接调用而不用创建实例。4、static和final一块用表示什么
    static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!
    对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
    对于方法,表示不可覆盖,并且可以通过类名直接访问。
      

  5.   

    1. Java中static变量一般用在什么场合? 
      不能被重新初始化 可否具体讲一下"不能被重新初始化"是什么意思吗? 我试了static变量初始化后可以修改啊
      

  6.   

    都是在new对象的时候才会调用.
    先初始化 所有 static修饰的东西.并且只执行这一次.
    然后再初始化 其他属性,再调用构造方法创造对象new一万个对象也只执行那一次静态方法这东西一时半会我也想不到什么解释方法..就看类型转换的例子.Integer.parseInt();这个就是一标准的静态方法.类名.方法名用是这么用的,具体什么时候用没具体要求.
    静态方法其实就是拿来偷懒用的.因为不用new对象.唯一要注意的就是静态方法不能调用非静态变量
      

  7.   

    static成员属性和static块是在JVM加载类之前初始化还是加载之后?
    我单步调试的时候,发现运行顺序是:static块-ClassLoader-main()
      

  8.   

    静态的,主要用在类级别上,据个例子,网页记录浏览量就是用static!
      

  9.   

    静态的与类关联,非静态的与对象关联!!!
    1:静态的一般用与整体共享,比如说统计一个在线人数的变量就使用静态变量;
    2:static 方法中不能调用非static变量,非static方法中能调用static方法;
    3:初始化过程:
               31.加载基类,初始化基类中的静态成员变量。           32.加载派生类,初始化派生类中的静态成员变量。           33.运行派生类的main方法。           34.初始化基类中的其他成员变量(static类型的除外)。           35.调用基类构造函数。           36.初始化派生类中的其他成员变量(static类型的除外)。           37.调用派生类构造函数
      

  10.   

    楼上的初始化过程是不是有问题啊???
    为什么初始化变量时,static类型的除外?
    我试了每次初始化都是先初始化static成员变量的
      

  11.   

    thinking in java 上有吧,1:当你想要的数据是在没有对象时也要用到的,或者是无论你创建了多少个对象这个数据只有一个那么就要用到static 了,你可以看看Integer.MAX_VALUE,这个虽然是个静态常量,但是这个量是没有什么对象真实存在的,也就是说无论你是不是创建了一个Integer的对象或者说你创建了多少个Integer对象,对Integer这个类来说它总是有一个最大值的,设成常量的原因是这个最大值是固定的,sun不允许我们随便把它改掉(java的安全性).2:这个问题我刚开始有点看不太明白,我也没试过,不过想想我们常用的main方法不就是static 的吗,你在外部定义的成员非static 变量好像是可以用在main里的吧!(这个问题我还没有实践,你可以试试)3:static 变量 的初始化我没太注意,因为它肯定会在你调用之前初始化完成.我查了一下,static 的变量会在其所在类被用到的时候第一时刻加载.也就是说你只要在程序中对程序中的static 变量做了初始化,那么就不用怕它在用到之前没有被初始化.(还是安全)不知道这是不是你要的答案,希望对你有帮助.不过你的结贴率不是很高,呵呵
      

  12.   

     当你想描述一个类的整体属性时就用static变量:因为静态 所以它只属于类本省而不与类的实例对象相关(但是可以通过对象去调用静态属性)比如人类的手的数 是2(个别除外) 他不因为某个实例对象而发生改变所以你声明人这个类的时候可以把手的数目这个属性声明成静态的。
    2: 楼主想想。既然静态方法是属于整个类的 它不会因为有了实例对象的存在而存在而是在类加载的时候就存在了 。楼主再想想 类加载的时候 类中普通的属性存在么?这个普通属性是在类加载时存在还是new一个对象时才存在? 所以 静态方法中不可以访问非静态的变量。
    3:见第2点。
      

  13.   

    static成员属性和static块是在JVM加载类之前初始化还是加载之后? 
    谁能回答?
    大家都说加载的时候调用,总有个前后吧
      

  14.   

    我感觉应该是是jvm加载类之后吧。不过我也不敢确定就是了
      

  15.   

    1.第一个问题主要自己理解,一般都是当类中的某个变量只需要用到一份,也就是在不同对象中使用的都是同一个变量,可以将其设为static的,可以通过类名.变量名直接调用
    2.static方法中不能直接调用非static的变量,比如main方法中,不能直接调用该类的其他非static变量,而需要通过对象调用。
    3.static变量的初始化在构造方法之前,当类第一次加载的时候,就会完成所有static成员的初始化
      

  16.   

    1.static变量可以叫全局变量 估计一些不可改变的数字什么的 用他吧 比如计数器 就是你是第几个访问的什么的。
    2.static方法不可以调用非static变量。因为 非static变量都需要对象引用  才可以使用的
    3.在内存创建的时候 他放的位置比较特殊 放到内存一个叫 data segment的内存单元 他初始化应该是比较早的,类加载他就有了。构造函数之前如有错误,希望有人可以批评!感谢!
      

  17.   

         1.简单的说,就是一个类的里面的变量,反应的一类整体的属性,而不是实例特有的属性的。比方说一群大雁,有多少只,是整体的属性,但是每只大雁有两个翅膀,是单体的属性。这是相对来说的,前面的例子成立的前提条件是你只把大雁当成一个类,如果你把雁群当作一个类,那么多少只,就是实例的特有属性了。
         2.不行。因为static方法可以说相独立于实例的一个过程。而非static变量是依赖于实例的。所以两者肯定不能融合。
         3.我记得不错的话,应该是类第一次被载入的时候,初始化。