• 静态域与静态方法


    • 静态域

    如果将域定义为static,每个类中只有这样一个域.而每一个对象对于所有的实例域却都有自己的一份拷贝.例如需要给每一个雇员赋予唯一的标识码.这里给Employee类添加一个实例域id和一个静态域nextId:

    class Employee{
        private static int nextId = 1;
        private int id;
        ......  
    }

    现在每个雇员对象都有一个自己的id域,但这个类的所有实例将共享一个nextId域.换句话说,如果有1000个Employee类的对象,则有1000个实例域id,但是,只有一个静态域nextId.即使没有一个雇员对象,静态域nextId也存在.它属于类,而不属于任何独立的对象.

    • 静态常量

    静态变量使用得比较少,但静态常量却使用得比较多.例如,在Math类中定义了一个静态常量:

    public class Math{
        ....
        public static final double PI = 3.1415926;
        ....
    }    

    在程序中,可以采用Math.PI的形式获得这个常量.

    如果关键字static被省略,PI就变成了Math类的一个实例域.需要通多Math类的对象访问PI,并且每一个Math对想都有它自己的一份PI拷贝.

    • 静态方法

    静态方法是一种不能向对象实施操作的方法.例如Math类的pow方法就是一个静态方法.表达式

    Math.pow(x,a);

    在运算时,不使用任何Math对象.换句话说,没有隐式的参数.

    可以认为静态方法是没有this参数的方法(在一个非静态方法中,this参数表示这个方法的隐式参数)

    Employee类的静态方法不能访问Id实例域,因为它不能操作对象.但是,静态方法可以访问自身类中的静态域.

    public static int getNextId(){
        return nextId;
    }

    可以通过类名调用这个方法

    int n = Employee.getNextId();

    注意:可以使用对象调用静态方法.例如,如果harry是一个Employee对象,可以使用Harry.getNextId()代替Employee.getNextId().不过,这种方式和容易造成混淆,其原因是getNextId方法计算的结果与harry毫无关系,所以建议使用类名,而不是对象来调用静态方法

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

    • 一个方法不需要访问对象状态,其所需参数都是通过显示参数提供(例如:Math.pow)
    • 一个方法只需要访问类的静态域(例如:Employee.getNextId())
  • 相关阅读:
    条款29:为“异常安全”而努力是值得的
    条款20.宁以pass-by-reference-to-const替换pass-by-vlaue
    对引用要注意
    基因组拼接中常见的名词解释
    序列联配(alignment)和数据库搜索方法简介
    几个重要生物信息中心及其数据库服务
    复杂分析-多序列比对相关
    大规模基因组测序中的信息分析 -- 拼接与注释
    生物信息学 第一课 什么是生物信息学
    zookeeper windows7下集群搭建
  • 原文地址:https://www.cnblogs.com/liuzhidao/p/13704680.html
Copyright © 2020-2023  润新知