请问如果一个方法名前用static 修饰,是什么意思?我也发现了如果用static 修饰这方法,就可以直接调用它,而不用创建对象来调用。那么加上了static ,这个方法本质上发生了什么变化?

解决方案 »

  1.   

    这是面向对象语言中的一个重要的关键字,被static关键字修饰的方法,将被作为一个类的静态方法。
    当我们的程序需要用到某一个类的时候,必须让这个类的代码和功能都载入内存,程序启动的时候,Java编译器会找到这个类,并把它自动载入内存,这个时候,静态方法也被载入内存(注意载入内存就是在内存中分配给这个类和这个方法一段存储空间)。当程序中需要用到这个方法的时候,就会从之前分配给这个方法的空间中去执行。而不加static关键字的属性或者方法,只有我们使用new关键字创建某个类的新的对象的时候,才会在内存中分配一个空间来存放它们的代码,然后调用的时候才能用。
      

  2.   

    加了static 这个方法就属于这个class 而不属于对象了。
      

  3.   

    每当编译了一个新类,就会产生一个Class对象(即被保存在同名的.class文件中).在运行时当我们想生成这个类的对象时,运行这个程序的jvm会首先检查这个类的Class对象是否已经加载.如未加载,jvm就会根据类名查找.class文件,并将其载入.所以java程序并不是一开始执行就会被完全加载的.而static 初始化就是在类加载时进行的.而其他的初始化就在它之后了!
    这个是static初始化的原理.
    当某个类的静态方法/静态字段首次被访问时,java解释器必须查找类路径,以定位.class文件.
      

  4.   

    去查一下jdk文档里的Class类就知道! haha
    二楼说得很好 !
      

  5.   

    2楼说的就是static的道理 背下来!噶
      

  6.   

    這篇文章告訴新手一些static的觀念與應用。其中可以解答一個很常見的問題,為什麼在static函式中只能呼叫static成員(資料成員或函式成員)?例如在main()函式中,這個問題對初學Java時的我一直是個問號,也許一些新手也覺得疑惑。文章若有謬誤,還請通知我進行修正,糾正我的觀念也免於誤導他人 =========================================================================
    對於每一個基於相同類別所產生的物件而言,其擁有各自的資料成員,然而在某些時候,我們會想要這些物件擁有相同的資料成員,其資料是共享的。舉個例子來說,在Ball類別中,我們會使用到圓周率的這個資料,對於任一個球而言,圓周率都是一樣的,我們並不需要讓不同的球物件擁有各自的資料成員來記錄圓周率,而這個記錄的值卻是相同,這只會增加記憶體的消耗而已。我們可以將資料成員宣告為static,被宣告為static的資料成員,它是屬於類別所擁有,而不是個別的物件,我們可以將static視為個別物件所擁有、共享的資料成員。 要宣告static變數,我們只要在宣告資料成員時加上static關鍵字就可以了,例如:
     
     
    class Ball {
    // ....
    public static double PI = 3.14159; // 宣告static資料public Ball() {
    // ..
    }public Ball(double radius, String name) {
    //...
    }
    public double getVolumn() {
    // ......
    }
    }
     
    我們可以在宣告物件之後,使用 . 運算子來存取static資料成員,static變數同樣遵守public、protected與 private的存取限制,所以若您要在類別之外直接存取static變數,必須注意它的權限(例如必須設定為public成員)。由於static成員屬於類別所擁有,所以在不使用物件名稱的情況下,我們也可以使用類別名稱加上 . 運算子來存取static資料成員,例如: 
     
     
    System.out.println("PI = " + Ball.PI);
     
    與static資料成員類似的,我們也可以宣告類別的成員函式為static函式,例如如果我們在Ball類別中想要提供設定PI值與傳回PI值的函式,如果這個PI值是屬於共用的數值(已經被宣告為static且為private成員),則我們不用在乎是由哪個物件來呼叫設定函式,我們可以將這些函式宣告為static,例如: 
     
     
    class Ball {
    // ....
    private static double PI = 3.14159; // 宣告static的private資料// ....public static double getPI() { // 宣告static函式
    return PI;
    }public static void setPI(double pi) {
    PI = pi;
    }
    }
     
    與static資料成員一樣的,我們可以透過物件名稱使用 . 運算子來存取static函式,例如: 
     
     
    System.out.println("PI = " + Ball.getPI());
     
    static資料與函式的作用之一,是提供公用類別函式,例如將數學常用常數或計算公式,以static宣告並撰寫,之後我們可以透過類別名稱來管理與取用這些函式,例如像Math.Exp、Math.Log()、Math.Sin()等等的static常數或函式等,事實上,像PI這個常數,在Math.PI就有定義,我們可以直接呼叫使用。由於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
     
      

  7.   

    把static方法看成与类关联的,而不是与对象关联的,本质上:
    static方法在类加载时即初始化,非static方法是在实例化类的对象时才初始化;
      

  8.   

    static就是编译前的变量。。(不知道哪里看来的。。好像是哪里c++的书)
    就是说程序当中任何一个类编译前static的方法或者属性就已经存在了所以也就有static method只能调用static attribute的说法。。那些都是编译前就能时候的。。其他的attribute喝method都要编译以后才能用。。static所以就不能调用一般的attribute喝method了
      

  9.   

    eForm是一个页面设计工具,它既能完成静态HTML页面的设计,也能读写数据库完成动态页面设计。它采图形化可视化操作,所见即所得;通过拖拉即可完成表单设计。提供多种数据类型和Html控件,并预实现常见的业务逻辑功能(新增、删除、修改、查看、查询、报表、打印、图表等),用户无需编程或是修改代码,完全在界面上操作即可设计完页面;也能写一些事件的代码以完成复杂表单的设计。 
         eForm实际上就是一个构件库,它对大量实用的控件进行了结构化的封装和调试。通过简单的拖拉设置就可以实现控件所能实现的功能,从而大大减少了代码的编写和调试难度. 
      

  10.   

    static 是实例共享的,非static 类是实例独有的