Java程序设计与应用开发(第3版)
上QQ阅读APP看书,第一时间看更新

3.3 关键字static

有时候,可能需要同类的各对象之间共享某些变量或方法,这些共享的变量或方法被称为类变量或者类方法。类变量或者类方法统称为静态对象。

用static关键字来声明类变量和类方法的格式如下。

类变量:

     static variableType variableName;

类方法:

     static returnType classMethod([paramlist]){…}

注意:每个实例对象对类变量的改变都会影响到其他的实例对象。类变量可通过类名直接访问,无须先生成一个实例对象,也可以通过实例对象访问类变量。类方法不能访问实例变量,只能访问类变量。类方法可以由类名直接调用,也可以由实例对象进行调用。类方法中不能使用this或super关键字。

静态变量可以有初值,就像实例变量一样。静态变量和方法都是通过类名字来访问的。为方便起见,也可以用具体对象来访问。

例3.10演示了如何显式调用静态方法。

例3.10 StaticDemo.java

     //静态方法的调用
     class MyMath{
       static final double PI=3.14159;
       static int max(int a,int b){
         return a>b?a:b;
       }
     }
     public class StaticDemo{
       public static void main(String[] args){
         //无须创建实例,即可直接调用
         System.out.println("PI="+MyMath.PI);
         System.out.println("max(100,200)="+MyMath.max(100,200));
       }
     }

调用静态方法的格式为:

     类名.方法名

注意:如果在声明时不用static关键字修饰变量或者方法,则表示是实例变量或实例方法。

每个对象的实例变量都独立分配内存,通过对象来访问这些实例变量。实例方法可以对当前对象的实例变量进行操作,也可以对类变量进行操作,实例方法由实例对象调用。

例3.11 StaticDemo2.java

     //静态成员的使用
     class  StaticDemo2{
       //实例变量
       int i;
       //静态变量
       static int j;
       static int arr[ ] = new  int[12];
       //静态初始化成员,初始化数组
       static{
         for(int i=0;i<arr.length;i++)
           arr[i] =i;
       }
       //实例方法
       void setI(int i){
         this.i =i;
       }
       //静态方法
       static void setJ(int j) {
         StaticDemo2.j=j;
       }
       public static void main(String []args ){
         StaticDemo2 sd2 = new StaticDemo2();
         StaticDemo2.j=2;             //正确: 通过类访问静态变量
         sd2.j =3;                    //正确: 通过实例访问静态变量
         StaticDemo2.setJ(2);         //正确: 通过类访问静态方法
         sd2.setJ(3);                 //正确: 通过实例访问静态方法
         sd2.i=4;                     //正确: 通过实例访问实例变量
         sd2.setI(7);                 //正确: 通过实例访问实例方法
         StaticDemo2.i=5;             //错误: 通过类访问实例变量
         StaticDemo2.setI(5);         //错误: 通过类访问实例方法
       }
     }

注意:static也可以用来修饰一个类,称为静态类。通常只有内部类才允许声明为静态的。