Java静态域

如果将域定义为static,那么每个中只有一个这样的域。作为对比,每一个对象对于所有的实例域却都有自己的一份拷贝。

例如,假定需要给每一个雇员赋予唯一的标识码。这里给Employee类添加一个实例域id和一个静态域nextId:

class Employee{
    ......
    private int id;
    private static int nextId = 1;
}
现在,每一个雇员对象都有一个自己的id域,但这个类的所有实例将共享一个nextId域。换句话说,如果有1000个Employee类的对象,则有1000个实例域id,其中任一实例使用了setId()方法后,Employee类的静态域都会变成设置后的值。但是,只有一个静态域nextId。即使没有一个雇员对象,静态域nextId也存在它属于类,而不属于任何独立的对象。从静态域通过类名直接调用,实例域通过(类的)实例调用,也可佐证。

再来看下静态方法

静态方法是不能向对象实施操作的方法。

例如,Math.pow(x, a),它在运算的时候,不使用任何Math对象。换句话说,没有隐式的参数(this)。

可以认为静态方法是没有this参数的方法。(在一个非静态的方法中,this参数表示该方法的隐式参数。)作为对比:非静态方法的调用(this.)pow();

因为静态方法不能操作对象,所以不能在静态方法中访问实例域。但是,静态方法可以访问自身类中的静态域

public static int getNextId(){
    return nextId;//return static field
}
通过类名调用这个方法:int n = Employee.getNextId();

注:静态域不能直接访问实例域(因为它是与类相关的而不是某个对象),但实例域可直接访问静态域(因为实例域是派生于类的)。

如果harry是一个Employee对象,可用harry.getNextId()来替代Employee.getNextId()。不过,这种方式很容易让人迷惑。因为getNextId方法计算的结果与harry毫无关系。故建议使用类名,而不是对象来调用静态方法。

在下面两种情况下使用静态方法:

1.当一个方法不需要访问对象状态,其所需参数都是通过显式提供的(例如Math.pow)。

2.当一个方法只需要访问类的静态域(例如Employee.getNextId)。

接下来看下静态内部类

有时候,使用内部类只是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外围类对象。为此,可以将内部类声明为static,以便取消产生的引用。

静态内部类的对象除了没有对生成它的外围类对象的引用特权外,与其他所有内部类完全一样。

例如,定义静态内部类Pair:

class ArrayAlg{
    public static class Pair{//不需要内部类引用外围对象,用static断绝这种引用。
      private double first;
      private double second;
      public Pair(double f, double s){
          first = f;
          second = s;
      }
      public double getFirst(){
          return first;
      }
      public double getSecond(){
          return second;
      }
      public static Pair minmax(double[] values){
          double min = Double.MAX_VALUE;
          double max = Double.MIN_VALUE;
          for(double v:values){
              if(min>v) min = v;
              if(max<v) max = v;
          }
          return new Pair(min,max);
      }
    }//end Pair
}

其中,ArrayAlg是内部类,Pair是静态内部类。
在主main中:

ArrayAlg.Pair p = ArrayAlg.Pair.minmax(d);//d:double数组
System.out.println("min="+p.getFirst()+",max="+p.getSecond());








Java静态域,布布扣,bubuko.com

Java静态域

上一篇:蓝桥杯 修改数组(并查集)


下一篇:Java Swing界面编程(17)---单行文本输入组件:JTextField