JAVA之父为什么要搞出一个static出来,有何用意呢? 

解决方案 »

  1.   

    static的变量和方法在内存中只会有一个副本,提高效率,节省资源。但是也不宜过多地使用。
      

  2.   

    应该是来自C/C++中的static吧。JAVA中一切都是对象。使用static可以在面向对象编程中实现类似全局变量,工具函数等功能。JAVA中一切都是对象。
      

  3.   

    在绝大数面向对象程序设计语言中,静态域被称为“类域”。
    术语“static”只是沿用了C++的叫法,并无实际意义。
      

  4.   

    谁说java一切皆对象的?
    function是对象吗?
    呵呵,扯远了!
    static在很多开发语言中都有,他的作用就像2楼说的,
    在类被装入的时候就会给static函数,变量,代码块分配内存空间。
    所以你才能够不用实例就进行调用。
    非static的成员必须通过类的实例化才会获得内存空间的分配(装入内存)。
      

  5.   


    如果你可以 不要任何类或实例化的时候,就可以使用static了
      

  6.   

    static是在C++里就有了,不是Java的发明。
      

  7.   

    爱因斯坦说,如果你不能够向一个6岁的小孩解释一个问题,并让他理解这个问题,那么你就没有真正理解这个问题。
    但是你所提出的问题,我无法向你解释,因为我也没有理解这个问题,或许你可以问一下java之父,他或许能够帮你解决这个问题,我想他自己也可能不太能够理解这个问题,他可能要去问C++之父这个问题,也许C++之父也无法解决这个问题,他们可能要去问发明这个单词的人,我想发明这个单词的人应该可以解释这个问题,可惜他死掉了,那么这个问题就永远是个谜了,那么你有机会了,如果你解决了这个问题,那你就是一个伟大的科学家、历史学家、语言学家了。
      

  8.   

    进来等着看老紫竹,ZangXT,火龙果,李晗等高手的留言。
      

  9.   


    java当然是一切皆对象
    在java里 不应该叫function 而应该叫 method 
    method当然是对象 看看反射就知道了
      

  10.   

    对于学习static我们先来看两个例子:
    //Example 1 Tst.java,no main() method
       package com.blogchina.qb2049;
       public class Tst
       {
          static { System.out.println("111111"); } 
       }
    运行结果为: 111111
               Exception in thread "main" java.lang.NoSuchMethodError: main
    同样的道理看第二个例子:
    //Example 2 TFrame.java,no main() method
    package com.blogchina.qb2049;
    import javax.swing.JFrame;
    public class TFrame
    {
        static {
                   JFrame jfr_fr= new JFrame("无main()窗体");
                   jfr_fr.setLocation(400,300);
                   jfr_fr.setSize(200,300);
                   jfr_fr.setVisible(true);
                   jfr_fr.setDefaultCloseOperation(jfr_fr.EXIT_ON_CLOSE);
                } 
    }运行结果如下图:
     
    这到底怎么回事,这不和我们大多数教程介绍的无main()方法程序似乎不能运行相矛盾吗。其实,这其中的缘由就在于那个static的修饰。我在学习java时,static的学习让我很受启发,特此把它的总结如下,希望对想学习java的朋友有所帮助。同时,本文中的不足还希望大家多多的提出来,我们共同学习。
    学习本文你到底要学到什么:
    1、 static在java中到底代表什么,为何要用它?
    2、 static在java中怎么用?
    3、 static 有那些特点和使用的“局限”?1、 static在java中到底代表什么,为何要用它?
         static――静态――“指定位置“
         首先,我们来看看java的内存:java把内存分为栈内存和堆内存,栈内存用来存放一些基本类型的变量和数组及对象的引用变量,而堆内存主要是来放置对象的。
          用static的修饰的变量和方法,实际上是指定了这些变量和方法在内存中的“固定位置”-static storage。既然要有“固定位置”那么他们的“大小”似乎就是固定的了,有了固定位置和固定大小的特征了,在栈中或堆中开辟空间那就是非常的方便了。如果静态的变量或方法在不出其作用域的情况下,其引用句柄是不会发生改变的。
          我们常看到:static变量有点类似于C中的全局变量的概念;静态表示的是内存的共享,就是它的每一个实例都指向同一个内存地址。把static拿来,就是告诉JVM它是静态的,它的引用(含间接引用)都是指向同一个位置,在那个地方,你把它改了,它就不会变成原样,你把它清理了,它就不会回来了。我们常可看到类似以下的例子来说明这个问题:
        class Student{
                    static int numberOfStudents=0;
                    Student()
                     {
                       numberOfStudents++;
                     }
                   }每一次创建一个新的Student实例时,成员numberOfStudents都会不断的递增,并且所有的Student实例都访问同一个numberOfStudents变量,实际上int numberOfStudents变量在内存中只存储在一个位置上。为了来更好的说明这个问题,我特意学习张老师(张孝祥)使用一个形象的图解:
                创建两个Student实例,stu1=new Student(); stu2=new Student();   
     
    多个实例共享一个变量似乎不足以让我们对static那么的热情,实际上java引入static却有另外的含义:
          (1)、引用static的方法和变量,不需要和实例捆绑在一起,这可以提高代码的编写的效率,这样的例子我们随处可见;
          (2)、java的主类中main()方法本身就是一个static的,所以main方法的执行就是在没有产生新的实例的情况;对于静态的东西,JVM在加载类时,就在內存中开辟了这些静态的空间,所以虽没有静态的main()方法但是程序还是执行了,不过抛出来了无main()方法的异常。这也不知算不算是java的一个漏洞;
          (3)、如果需要创建一个脱离于实例的变量或方法(只与整个类有关),那么用static作修饰是再好不过了,如我们经常看到要统计实例实现的个数(通常的例子就是计数)。
          (4)、使用一种静态的方法的编程通常叫做防御(defensive)编程,它可以在API供应商突然中断支持的情况下保护代码 2、 static在java中怎么用?
         使用static时,要记着我阐述的static代表什么。
          static使用非常的简单,如果要修饰一个静态块只需:staic {……..}即可(常用静态块来初始化一些变量); 静态方法就参照main()的形式:访问标识 static returnType method(…) {};静态变量就是:static type fields;
         在使用静态的方法时,可以直接用类名来引用,不需要创建实例(当然创建实例也是可以的),例如,System.out,String.valueOf()等等。
    3、 static 有那些特点和使用的“局限”?
         从上面的分析可知,static的东西在类加载时,就分配了内存空间,即编译时就为这些成员变量的实例分配了空间。
          那么在static块内和方法体内,我们能给它放一个在内存中还没有着落的变量?显然与我们先前所说的相左。static的东西,人家是在static storage中有“指定位置“的,如果我们茫然的在static的作用域中放置一个普通的变量,那么编译时JVM就毫不客气的给你个异常:
    non-static variable a cannot be referenced from a static context或non-static method Test() cannot be referenced from a static context(注:Test()是我试验时的一个例子),除非我在static中现场开辟空间,用new来要内存。
    对于static的初始化问题,我们还是值得讨论的。现看下面的例子:
    //StaticInit show the static decorated initialization 
    package com.blogchina.qb2049;
    public class StaticInit
    {
       static int i;
       int a;
       public StaticInit()
       {
          a=6;
          System.out.println("a 的初始化"+a);
       } 
       public static void main(String[] args)
    {
        new StaticInit();
    }
    static 
    {
         i=5;
         System.out.println("i 的初始化"+i);
    }
    }运行结果如下:i 的初始化5
                            a 的初始化6 静态块的初始化要早于非静态的,原因就是在于这些东西是在类装载时就开始初始化了。
          说起static的“局限“,总结起来就是:在static的方法中仅能够调用其他的static方法和static变量;在static方法中不能以任何方式引用this或super;static变量在定义时必须进行初始化,并且初始化的时间早于非静态。还有一个局限我需要具体的说明一下,static的变量的初始化仅能一次,如下例:
        //Static.java, initialize only one
        class T1
        {   
         static int t=1;
         T1(int b)
         {
           t=b;
         }
       }
       public class Static
        {
           T1 t1=new T1(2);
           T1 t2=new T1(3);
           T1 t3=new T1(4);
           public Static()
           {
             System.out.println("t1: "+t1.t);
             System.out.println("t2: "+t2.t);
             System.out.println("t3: "+t3.t);
          }
          public static void main(String args[])
          {
            new Static();
          }
       }
    运行结果为: t1: 4
                        t2: 4
                        t3: 4
    该static变量只是接受了最后一次的初始化.实际这还是我们先前提到的多个实例共享一个静态的变量的问题。
    总之,static就是给我们一个这样的忠告:static的东西在编译时,就已向内存要到了存取空间了。
      

  11.   

    据说java不支持fisrt class function,
    也就没有办法closure了。
    至于是应该叫method还是function呵呵,
    是不是把这个东西看的太过概念化了。
    多看看其他语言,你就会对method与function的区别淡化了。
    最后,没有鄙视java的意思,本人也是靠java吃饭的。
    不过是对一些不准确的说法有些意见罢了!
      

  12.   

    不宜多用 只是相对而言的 换句话说 就是考虑好了再用 因为静态的变量或者方法在类还没有实例化的时候就存在了 但是有时候滥用会造成浪费 (当然了 省了创建对象)当然 有时候静态方法也有这比较突出的优势 就是不用创建对象就能调用方法 比如Math类中的一些方法
      

  13.   

    补充一点 static的存在 有点违背面向对象的思想 因为面向对象首先要有对象 但是static除了依附于某个对象 就和对象没有任何关系了 但是 使用的方便和高效  还是它的一个大优点吧
      

  14.   

    如果频繁使用某一个属性或对象的话,可以使用static,提高效率
      

  15.   

    Java之父说:"没有啊,我随便加上去的呀, 你们竟然还拿来实现单例模式, 我晕..."
      

  16.   

    谢谢各位的回答,我总结一下吧。 对于一个函数,加不加static,它的地址都是一样的。JVM在载入类后,会把函数分配固定的地址。所以加不加static函数的地址是一样的。所以二者在都是需要考虑同步的问题。 那JAVA之父为什么要提出static呢? 
    我想主要是为了“共享”。一段static资源(变量,函数)可以被程序中的其它代码共享。而不加static就不一样了,不加static必须依赖某一个对象才行。 所以函数加不加static就是类与对象的区别。 类是静态的,而对象则是动态的。 那么我们时候用static呢? 
    很简单,需要共享的时候,就用static吧。