本文将介绍静态域、静态常量、静态方法以及静态方法的常见用途之静态工厂方法。
一、静态域
如果将域定义为static,那么这个是静态域
。对于静态域
,类的所有实例共享
它,对于实例域
,类的实例都会有一份自己的拷贝
。
例如,在下面这个例子中,nextId就是静态域
,id则是实例域
。该类的所有实例共享nextId,但是该类的所有实例都有自己的一个id域。也就是,你创建n个Employee类的实例,会有n个id域,但只有一个nextId域。
注意
:即使没有一个实例,静态域nextId也存在。
class Employee{
private static int nextId = 1;
private int id;
...
}
二、静态常量
静态变量使用得比较少,但静态常量
却使用得比较多。例如, 在 Math 类中定义了一个静态常量
:
public class Math
{
public static final double PI = 3.14159265358979323846;
}
如果关键字 static 被省略, PI 就变成了 Math 类的一个实例域。需要通过 Math 类的对象访问 PI,并且每一个 Math 对象都有它自己的一份 PI 拷贝。
一个被经常使用的静态常量是System.out
我们查看一下它的源码,发现out是被定义为static final
注意
:由于每个类对象都可以对公有域进行修改, 所以,最好不要将域设计为 public。然而, 公有常量(即 final 域
)却没问题。 因为 out 被声明为 final, 所以,不允许再将其他打印流陚给它
。
三、静态方法
1、基本介绍:
静态方法
,也叫类方法
。
两种使用形式如下:
访问修饰符 static 数据返回类型 方法名(){}
static 访问修饰符 数据返回类型 方法名(){}
2、静态方法的调用:
使用方式两种都可:
类名.类方法
对象名.类方法名
3、静态方法与普通方法的区别:
(1)静态方法
是没有this
参数的;普通方法隐含着this
参数。
(2)静态方法
可以通过类名调用
,也可以通过对象名调用
;普通方法
和对象有关,需要通过对象名调用
,比如对象名.方法名(参数),不能通过类名调用。
(3)静态方法
中不允许使用与对象有关的关键字
,比如this和super;普通方法可以
。
(4)静态方法
种只能访问静态变量和静态方法
;普通成员方法
,既可以访问普通
的成员(方法),也可以访问静态
的成员(方法)。
4、使用情况:
(1)一个方法不需要访问对象状态
,其所需参数都是通过显式参数提供。
(2)一个方法只需要访问类的静态域
。
四、工厂方法(静态方法的常见的用途)
静态工厂方法:既可以在ADT内部实现,也可以构造单独的工厂类。
缺点:不满足开闭原则,每次增加一种类型,都需要在这里修改代码;但是开闭原则需要付出比较大的代价
总结
该篇文章介绍了静态域、静态常量、静态方法以及静态方法的常见用途之静态工厂方法。