请问如果一个方法名前用static 修饰,是什么意思?我也发现了如果用static 修饰这方法,就可以直接调用它,而不用创建对象来调用。那么加上了static ,这个方法本质上发生了什么变化?
解决方案 »
- 问个网络的问题.不知道应该发在哪?
- 怎么使JFRAME的叉子变灰呀
- 我有thinking in java中文3版,谁要?
- ant build.xml include ="**/*.*"
- Socket获取数据流的一个问题
- 请教一个关于模糊查询参数'%?%'的问题,baidu,google都搜不出来
- java可以读取出word等文件的摘要信息嘛?
- 如何取得自己的外部IP
- 已有一个现成的Web系统,可以看但不能修改,从主页到达result画面需要Login画面,search画面,现从另一个系统直接到达result画面如何解决?
- jbuilder怎么生成可执行文件?请高手指点,高分等待!
- java语言识别问题
- 各位给推荐一些jdbc和网络的java书籍:)
当我们的程序需要用到某一个类的时候,必须让这个类的代码和功能都载入内存,程序启动的时候,Java编译器会找到这个类,并把它自动载入内存,这个时候,静态方法也被载入内存(注意载入内存就是在内存中分配给这个类和这个方法一段存储空间)。当程序中需要用到这个方法的时候,就会从之前分配给这个方法的空间中去执行。而不加static关键字的属性或者方法,只有我们使用new关键字创建某个类的新的对象的时候,才会在内存中分配一个空间来存放它们的代码,然后调用的时候才能用。
这个是static初始化的原理.
当某个类的静态方法/静态字段首次被访问时,java解释器必须查找类路径,以定位.class文件.
二楼说得很好 !
對於每一個基於相同類別所產生的物件而言,其擁有各自的資料成員,然而在某些時候,我們會想要這些物件擁有相同的資料成員,其資料是共享的。舉個例子來說,在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
static方法在类加载时即初始化,非static方法是在实例化类的对象时才初始化;
就是说程序当中任何一个类编译前static的方法或者属性就已经存在了所以也就有static method只能调用static attribute的说法。。那些都是编译前就能时候的。。其他的attribute喝method都要编译以后才能用。。static所以就不能调用一般的attribute喝method了
eForm实际上就是一个构件库,它对大量实用的控件进行了结构化的封装和调试。通过简单的拖拉设置就可以实现控件所能实现的功能,从而大大减少了代码的编写和调试难度.