• Java--静态字段与静态方法


    1、静态字段

    如果将一个字段定义为static,每个类只有一个这样的字段。而对于非静态的实例字段,每个对象都有自己的一个副本。

    例如:

    class Employee 
    {
        private static int nextId = 1;
        
        private int id;
        ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    其中,每一个Employee对象都有一个自己的id字段,但这个类的所有实例将共享一个nextId字段。换句话说,如果有1000个Employee类对象,则有1000个实例字段id,分别对应每一个对象。但是,只有一个静态字段nextId。即使没有Employee 对象,静态字段nextId 也存在。它属于类,而不属于任何单个的对象。

    注释:

    在一些面向对象程序设计语言中,静态字段被称为类字段。术语“静态”只是沿用了C++的叫法,并无实际意义。

    2、静态常量

    Math类中的一个静态常量

    public class Math
    {
        ...
        public static final PI = 3.1415926535897932846;
        ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在程序中用Math.PI来访问这个变量。

    如果省略关键字static, PI 就变成了Math 类的一一个实例字段。也就是说,需要通过Math类的一个对象来访问PI,并且每一一个Math对象都有它自己的一个PI副本。

    System类中你的一个静态常量

    public class System
    {
        ...
        public static final PrntStream out = ...;
        ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    静态常量只能访问,不能直接修改。

    如:

    System.out = new PrintStream(...); // ERROR--out is final
    
    • 1

    3、静态方法

    静态方法是不在对象上执行的方法。例如,Math类中pow方法就是一个静态方法。表达式:Math.pow(x,a).

    Employee类的静态方法不能访问id实例字段,因为它不能在对象上执行操作。但是,静态方法可以访问静态字段。

    示例:

    public static int getNextId()
    {
        return nextId; //返回静态字段
    }
    
    • 1
    • 2
    • 3
    • 4

    可以直接用类名调用该方法:

    int n = Employee.getNextId();
    
    • 1

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

    • 方法不需要访问对象状态,因为它需要的所有参数都通过显式参数提供(例如:(Math.pow)。
    • 方法只需要访问类的静态字段( 例如: Employee . getNextId)。

    4、main方法

    ​ 需要注意,可以调用静态方法而不需要任何对象。例如,不需要构造Math类的任何对象就可以调用Math,pow。同理,main 方法也是-一个静态方法。

    public class Application
        public static void main(String[] args)
        	// construct objects here
       		 ...
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    ​ main方法不对任何对象进行操作。事实上,在启动程序时还没有任何对象。静态的main方法将执行并构造程序所需要的对象。

    提示:

    每一个类可以有一个main方法。这是常用于对类进行单元测试的一个技巧。例如,可以在Employee类中添加一个main方法:

    class Employee
    public Employee(String n, double s, int year, int month, int day)
    {
       name = n;
       salary = s;
       hireDay = LocalDate. of(year, month, day);
    }
    public static void main(String[] args) // unit test
    {
       var e = new Employee("Romeo", 50000, 2003, 3, 31);
       e.raiseSalary(10);
       System.out . println(e.getName() +""+ e.getSalary());
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    如果想要独立地测试Employee类,只需要执行

    java Employee
    
    • 1

    如果Employee类是一个更大型应用程序的一部分,就可以使用下面这条语句运行程序

    java Application
    
    • 1

    Employee类中的main方法永远不会执行

  • 相关阅读:
    采用协同搜索策略的算术优化算法
    JavaScript之事件高级(53rd)
    饥饿游戏搜索算法(HGS)(含java实现代码)
    2020年最全Java面试汇总整理(含答案),再也不用担心面试被挂了
    UI自动化测试中公认最佳的设计模式-POM
    【Vue基础篇】学习vue就像打游戏一样简单
    第二十四章·策略模式
    【python海洋专题三十八】海洋指数画法--折线图样式二
    C++ 学习(20)STL - map容器
    HBase,JavaAPI操作 HBase,220827,
  • 原文地址:https://blog.csdn.net/qq_62254095/article/details/132582711