靜态變量、常量和方法
靜态變量将變量值存儲在一個公共的記憶體位址。它可以被類中的所有對象所共享。因為它是公共的位址,是以如果某一個對象修改了靜态變量的值,那麼同一個類中的所有對象都會受到影響。(ps:在UML類圖中,靜态變量和靜态方法是以下劃線标注的)
類中的常量是被該類的所有對象所共享的。是以,常量應該聲明為final static,例如Math類中的常量PI如下:
final static double PI = 3.14159265358979323846;
執行個體方法和執行個體資料都是屬于執行個體的,是以它們在執行個體建立之後才能使用。通過引用變量來通路。
靜态方法和靜态資料通過引用變量或它們的類名來調用。
執行個體:
package chapter9;
public class CircleWithStaticMembers {
/** The radius of the circle */
double radius;
/** The number of the objects created */
static int numberOfObjects = 0;
/** Construct a circle with radius 1 */
CircleWithStaticMembers() {
radius = 1.0;
numberOfObjects++;
}
/** Construct a circle with a specified radius */
CircleWithStaticMembers(double newRadius) {
radius = newRadius;
numberOfObjects++;
}
/** Return numberOfObjects */
static int getNumberOfObjects() {
return numberOfObjects;
}
/** Return the area of this circle */
double getArea() {
return radius * radius * Math.PI;
}
}
package chapter9;
public class TestCircleWithStaticMembers {
/** Main method */
public static void main(String[] args) {
System.out.println("Before creating objects");
System.out.println("The number of Circle objects is " +
CircleWithStaticMembers.numberOfObjects);
//顯示對象個數為0,因為還沒建立任何對象
// Create c1
CircleWithStaticMembers c1 = new CircleWithStaticMembers();
//c1建立後,靜态變量numberOfObjects變成1
// Display c1 BEFORE c2 is created
System.out.println("\nAfter creating c1");
System.out.println("c1: radius (" + c1.radius + ") and number of Circle objects (" + c1.numberOfObjects + ")");
// Create c2
CircleWithStaticMembers c2 = new CircleWithStaticMembers(5);
//c2建立後,靜态變量numberOfObjects變成2
// Modify c1 c1.radius = 9;
// Display c1 and c2 AFTER c2 was created System.out.println("\nAfter creating c2 and modifying c1");
System.out.println("c1: radius (" + c1.radius + ") and number of Circle objects (" + c1.numberOfObjects + ")");
System.out.println("c2: radius (" + c2.radius + ") and number of Circle objects (" + c2.numberOfObjects + ")"); }}
CircleWithStaticMembers.numberOfObjects的用法可以提高可讀性,
因為通過類名引用則清楚明了,通過類似c1.numberOfObjects的用法則不好識别靜态變量。
那麼具體怎麼識别一個變量或方法是靜态還是執行個體的呢?
①如果一個變量或者方法依賴于類的某個具體執行個體,那麼就應該将他定義成執行個體變量或者執行個體方法。例如:radius依賴于某個具體的圓,geiRadius方法也是執行個體方法,依賴于某個具體的圓。
②如果一個變量或者方法不依賴于類的某個具體執行個體,那麼就應該将他定義成靜态變量或者靜态方法。例如:main方法可以直接從類中調用。