静态方法的缺陷
静态方法的一个常见缺陷是从静态方法中引用每个对象的数据。这将出现问题,因为静态方法没有指向单个对象数据的隐式“this”指针。而且,如果试图从一个静态方法中访问一个实例变量,编译程序不会知道到底需要哪一个对象并将会产生错误信息。典型的错误信息是“Can't make static referenc to non-static variable.”。
public static voild main(String[] args) {
salary = 50000; //BZZT! does not work
Employee e = new Employee("Fred",50000);
e.salary = 50000; //WORKS fine.
如果需要在静态方法中引用实例(每个对象的)数据和方法,一种做法是在静态方法中声明和实例化一个对象,然后就可以访问这个实例的数据和方法了。
前面已经说过,并不是真正地保持实例方法的每个实例副本。那么,静态方法的用途是什么呢?当方法所做的处理只与整个类有关,而且并不特别针对一个实例时,则应把这个方法声明为静态的。java.lang.String类有若干个valueOf()方法,他们均接受一个基本类型(布尔和整数等)参数,然后把参数值作为String返回。这些方法都是静态的,因此无需要使用字符串实例就可以调用它们,示例如下:
String s = String.valueOf(123.45); //OK
javalang.Math 包中的方法都是静态方法,如abc()、sin()、cos()和exp()等。只需如下所示的那样调用它们即可:
double d = Math.abs(-12.0);
最后,程序的开始执行位置main()方法也是静态的。如果不是,则在调用它之前,需要先创建实例,如同在applet和Servlet中所做的那样。