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方法可以直接从类中调用。

猜你喜欢

转载自blog.csdn.net/qq_35827280/article/details/80310999