谁还能说清楚 static和非static的区别 什么时候用static 什么时候不能用  用了有什么好处 又会产生哪些坏处
    有哪些应用场景
    先别百度  照自己想的来写一写
    反正我菜 突然之间发现自己不记得了

解决方案 »

  1.   

    static可以修饰类变量和类方法,或者限定静态块。
    static修饰类变量时,该变量每个类只有一份。
    static修饰方法时,调用是直接绑定,性能会比多态情形略好(非优化情况下).static方法不存在覆盖和多态现象。
    static修饰静态块: 
    class Test{
     static{}
     }
    类加载时执行一次。应用场景:面向问题进行分析,一般不需要根据性能等问题来考虑。
      

  2.   

    刚好今天写了个死锁程序。但是少了两个static,猜猜少在哪?
    package JavaBasic;public class DeadLock implements Runnable{ public int flag=1;
    Object o1=new Object();
    Object o2=new Object();
        public void run(){
         System.out.println("flag="+flag);
         if(flag==1){
         synchronized(o1){
         try{
         Thread.sleep(2000);
         }catch(InterruptedException e){
         System.out.println(e.getMessage());
         }
         synchronized(o2){
         System.out.println("flag=1 enter o2");
         }
         }
        
         }
         if(flag==0){
         synchronized(o2){
         try{
         Thread.sleep(2000);
         }catch(InterruptedException e){
         System.out.println(e.getMessage());
         }
         synchronized(o1){
         System.out.println("flag=0 enter o1");
         }
         }
         }
        }
    public static void main(String[] args) {
    DeadLock td1=new DeadLock();
    DeadLock td2=new DeadLock();
    td1.flag=1;
    td2.flag=0;
    new Thread(td1).start();
    new Thread(td2).start();
    }}
    当然是Object o1=new Object();
    Object o2=new Object();
    static修饰的方法是类方法,执行时不需要类的实例就可运行。修饰的变量是类变量;在引用static
    方法和变量时,如果类还没加载,会引起类的加载。static不能修饰方法中的变量。
    static代码段会在类加载的时候执行。static变量也称为哨兵变量。大家继续
      

  3.   

    嗯,据我理解 定义了static属性(变量) 就像全局变量一样,原理:在加载类的时候,就在内存中为这块静态变量分配空间了哦。其他成员变量在创建对象的时候才会为其分配空间哦。谈点内存
    静态变量是存在内存中data segment区域的,而且只在加载类的时候初始化一次
    局部变量是存在内存中栈里面的哦。谈点使用
    静态变量是不用创建对象就能直接拿来用的 类名.静态变量名  当然你也可以 对象.静态变量名
      

  4.   

    静态方法么 直接用 类名.静态方法使用  当然也可以用实现了此类的对象来调用想想我们的public static void main(){}
    你使用的时候,在此方法中不能访问非静态变量,非静态方法。当然更不能使用this,super等关键字。
    这是我所理解的 就这些了 呵呵
      

  5.   

        static可以修饰内部类,方法,变量,也可以限定静态代码块。被它修饰的内部类、变量或方法属于类而不从属于某一具体的对象,所以它们的使用方法也比较特殊,如:
      类A有被static修饰的内部类B,那么B的对象的定义为:A.B b = new A.B();
      而方法或变量可以如此使用:this.(方法名)或this.(变量名) 。
      被static修饰的静态代码块优先于其他代码执行。
         说到static,不得不提修饰main方法的static。为什么main方法要用static修饰呢?那是因为static修饰的方法可以被类直接使用,所以main方法可以直接被虚拟机调用,这样使用比较方便。
         static的缺点是:不当使用static时,导致内存没有被及时释放。
      

  6.   

    对于每一个基于相同类别所产生的对象而言,其拥有各自的资料成员,然而在某些时候,您会想要这些对象拥有相同的资料成员,其资料是共享的。举个例子来说,在Ball类别中,您会使用到圆周率的这个资料,对于任一个球而言,圆周率都是一样的,您并不需要让不同的球对象拥有各自的资料成员来记录圆周率,而这个记录的值却是相同,这只会增加内存的消耗而已。您可以将资料成员声明为"static",被声明为"static"的资料成员,它是属于类别所拥有,而不是个别的对象,您可以将"static"视为个别对象所拥有、共享的资料成员。要声明static变量,您只要在声明资料成员时加上"static"关键字就可以了,例如:public class Ball { 
        // .... 
        public static double PI = 3.14159; // 声明static资料
     
        public Ball() { 
            // .. 
        } 
     
        public Ball(double radius, String name) { 
            //... 
        } 
     
        public double getVolumn() { 
          // ...... 
        } 

    由于static成员属于类别所拥有,所以在不使用对象名称的情况下,您也可以使用类别名称加上 . 运算子来存取static资料成员,例如:System.out.println("PI = " + Ball.PI); 
    static变量同样遵守public、protected与 private的存取限制,所以若您要在类别之外直接存取static变量,必须注意它的权限(例如必须设定为public成员)。虽然您也可以在声明对象之后,使用 . 运算子来存取static资料成员,但是这并不被鼓励,通常建议使用类别名称加上 . 运算子来存取,一方面也可以避免与非static成员混淆。与静态资料成员类似的,您也可以声明方法成员为static方法,又称静态方法,被声明为静态的方法通常是为了提供工具,例如在Ball类别上增加一个角度转径度的方法toRadius():public class Ball { 
        ...
        public static double toRadius(double angle) {
             return 3.14159 / 180 * angle;
        }
    }
    与静态资料成员一样的,您可以通过类别名称使用'.'运算子来存取static方法(当然要注意权限设定,例如设定为public),例如:System.out.println("角度90等于径度" + Ball.toRadius(90)); 静态资料与静态方法的作用通常是为了提供共享的资料或工具方法,例如将数学常用常量或计算公式,以static声明并撰写,之后您可以把这个类别当作工具,通过类别名称来管理与取用这些静态资料或方法,例如像J2SE 所提供的Math类别上,就有Math.PI这个静态常量,以及Math.Exp()、Math.Log()、Math.Sin()等静态方法可以直接使用,另外还有像Integer.parseInt()、Integer. MAX_VALUE等也都是静态方法与静态资料成员的实际例子。由于static成员是属于类别而不是对象,所以当您呼叫static方法时,并不会传入对象的位置参考,所以static方法中不会有 this参考,由于没有this参考,所以在Java的static方法成员中不允许使用非static成员,因为程序没有this来参考至对象位址,也就无法辨别要存取哪一个对象的成员,事实上,如果您在static方法中使用非static资料成员,在编译时就会出现以下的错误讯息:non-static variable test cannot be referenced from a static context
    或者是在static函式中呼叫非static函式,在编译时就会出现以下的错误讯息:non-static method showMe() cannot be referenced from a static context
    Java在使用到类别时才会加以载入程序中,如果您要使用一个static资料或方法,而在载入一个类别时,您希望先进行一些初始化动作,您可以使用static定义一个区块,并在当中撰写初始化资源的动作,例如:public class Ball { 
        static { 
            // 一些初始化程序码 
        }     .... 
    } 像上面这样一个类别,在第一次呼叫而被载入时,static区块中的程序码就会被执行,且只会执行一次。
      

  7.   

    static类型的数据域,在初始化的时候比非static的优先。
      

  8.   

       static 是在程序加载的时候就加载到内存中,而非static 是在用是才加载到内存中。用你的硬件资源比较好的话,可用static ,反之则不要经常用之则妙……
      

  9.   

    楼上的GGMM都说了这么多了
    我觉得static成员变量是常驻内存的
    就是说如果你的程序启动静态变量就占据内存一块位子
    除非你手动释放,要不他会一直占据了内存指导程序终止
    这也就是为什么不建议大量用static修饰变量的原因吧 
      

  10.   

    而非静态变量会有java虚拟机的垃圾回收机制
    自动去检测。当检测到没用引用指向某块内存时
    垃圾回收机制会自动释放此内存
      

  11.   

    需要全局共享的,标记个static,只是局部使用的,就不用static了与场景无关的,标记为static,与场景相关的,你依然可以用静态,将场景做参数传入,也可以标记为非static
      

  12.   

    静态 定义的常量 叫类常量。
    static final int
    我也是来学习的。