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())
  • 相关阅读:
    LeetCode 769. Max Chunks To Make Sorted
    LeetCode 845. Longest Mountain in Array
    LeetCode 1059. All Paths from Source Lead to Destination
    1129. Shortest Path with Alternating Colors
    LeetCode 785. Is Graph Bipartite?
    LeetCode 802. Find Eventual Safe States
    LeetCode 1043. Partition Array for Maximum Sum
    LeetCode 841. Keys and Rooms
    LeetCode 1061. Lexicographically Smallest Equivalent String
    LeetCode 1102. Path With Maximum Minimum Value
  • 原文地址:https://www.cnblogs.com/liuzhidao/p/13704680.html
Copyright © 2011-2022 走看看