java 核心技术-12版 卷Ⅰ- 4.4.3 静态方法
原文
静态方法是不操作对象的方法。例如,Math 类的pow 方法就是一个静态方法。以下表达式
Math.pow(x,a);
会计算 x^a 。它并不使用Math 对象的来完成这个任务。换句话说,它没有隐式参数。
可以认为静态方法是没有this 参数的方法(在一个非静态方法中,this参数指示这个方法的隐式参数参见4.3.7 节)。
Employee 类的静态方法不能访问id实例字段,因为它并不操作对象。但是,静态方法可以访问静态字段。下面是这样一个静态方法的示例:
要调用这个方法,需要提供类名:
int n = Employee.advanceId();
这个方法可以省略关键字static 吗?答案是肯定的。但是这样一来,你就需要通过Employee类型的对象引用来调用这个方法。
注释:可以使用对象调用静态方法,这是合法的。例如,如果harry 是一个Employee对象,那么可以调用harry.advanceId(); 而不是 Employee.advancedId()。不过,我发现这种写法很容易造成混淆,其原因是advanceId方法计算的结果与harry 毫无关系。我们建议使用类名而不是对象来调用静态方法。
下面两种情况可以使用静态方法:
方法不需要访问对象状态,因为它需要的所有参数都通过显式参数提供(例如Math.pow)。
方法只需要访问类的静态字段(例如 Employee.advanceId)
C++ 注释 : Java中的静态字段与静态方法在功能上与C++相同。但是,语法稍有所不同。在C++中,要使用:: 操作符访问作用域之外的静态字段或静态方法,如Math::PI。
术语“静态”有一段不寻常的历史。起初,C引入关键字static 是为了表示退出一个块后依然存在的局部变量。在这种情况下,术语“静态”是有意义的:变量一直保留,当再次进入这个块时它仍然存在。随后,static在C中有了第二种含义,表示不能从其他文件访问的全局变量和函数。重用关键字static 只是为了避免引入一个新的关键字。最后,C++第三次重用了这个关键字,与之前赋予的含义完全无关,它指示属于类而不属于任何特定类对象的变量和函数。这与Java中这个关键字的含义相同。