zoukankan      html  css  js  c++  java
  • 静态域与静态方法

    • 静态域

    如果将域定义为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())
  • 相关阅读:
    洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk( 普及-)
    洛谷 P1909 [NOIP2016 普及组] 买铅笔
    全排列问题
    集合的划分(setsub)
    自然数拆分-回溯
    洛谷 P4414 [COCI2006-2007#2] ABC
    洛谷 P5709 【深基2.习6】Apples Prologue
    洛谷 P4326 [COCI2006-2007#1] Herman
    平面分割
    洛谷 P1601 A+B Problem(高精)
  • 原文地址:https://www.cnblogs.com/liuzhidao/p/13704680.html
Copyright © 2011-2022 走看看