• 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也存在它属于类,而不属于不论什么独立的对象。从静态域通过类名直接调用,实例域通过(类的)实例调用,也可佐证。

    项目中遇到的一个样例:假设写一个类XDialog继承Dialog,XDialog里面有个域变量private List<String> items;我每次要显示一个对话框时都new XDialog();这时这个对话框就有了一个items拷贝。new N个XDialog就有N个相应的items拷贝。但若items是指当前用户的好友数目,那么XDialog对话框中就应该时时显示正确的上/下线好友。若是N个items拷贝,就每次都初始化了items。不能达到同步的目的,且效率低。这时用statickeyword就攻克了全部问题,仅仅需声明privatestatic List<String> items;这时items为XDialog这个类全部,而非某个实现。Perfect!

    再来看下静态方法

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

    比如,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()。只是,这样的方式非常easy让人迷惑。由于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());

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    Singleton 单例模式 泛型 窗体控制
    SpringMVC异常处理注解@ExceptionHandler
    如何实现beanutils.copyProperties不复制某些字段
    Spring 注解学习笔记
    使用客户端SVN在Update时遇到Previous operation has not finished; run 'cleanup' if it was interrupted,需要cheanup文件夹,解决方式
    jQuery的选择器中的通配符
    mysql str_to_date字符串转换为日期
    Mybatis中mapper.xml文件判断语句中的单双引号问题
    Jquery中each的三种遍历方法
    Javascript 中动态添加 对象属性
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4649514.html
Copyright © 2020-2023  润新知