天天看點

JAVA程式設計--對象和類(四)靜态變量、常量和方法

靜态變量、常量和方法

靜态變量将變量值存儲在一個公共的記憶體位址。它可以被類中的所有對象所共享。因為它是公共的位址,是以如果某一個對象修改了靜态變量的值,那麼同一個類中的所有對象都會受到影響。(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方法可以直接從類中調用。

繼續閱讀