Java中的静态字段、静态常量与静态方法

静态字段

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

在一些面向对象程序设计语言中,静态字段被称为类字段。

class Employee {
	private static int nextId = 1;
	private int id;
}

静态常量

静态变量使用得比较少,但静态常量却很常用。例如,在Math类中定义一个静态常量:

public class Math {
	public static final double PI = 3.14159265358979323846;
}

在程序中可以使用Math.PI来访问这个常量。
如果省略关键字static,PI就变成了Math类的一个实例字段。也就是说,需要通过Math类的一个对象来访问PI,并且每个对象都有自己的一个PI副本。

另一个静态常量的例子是System.out。它在System类中声明如下:

public class System {
	public static final PrintStream out = ...;
}

不允许再将它重新赋值为另一个打印流:

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

如果查看System类,就会发现有一个setOut方法可以将System.out设置为不同的流。原因在于,setOut方法是一个原生方法,而不是在Java语言中实现的。原生方法可以绕过Java语言的访问控制机制。

静态方法

静态方法是不在对象上执行的方法。例如Math.pow(x,a)。在完成运算时,它并不使用任何Math对象。换句话说,它没有隐式参数。

可以认为静态方法是没有this参数的方法。

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

public static int getNextId() {
	return nextId;
}

可以提供类名来调用这个方法:

int n = Employee.getNextId();

可以使用对象调用静态方法,这是合法的。不过这种写法很容易造成混淆,其原因是静态方法计算的结果与对象毫无关系。建议使用类名而不是对象来调用静态方法。

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

  • 方法不需要访问对象状态,因为它需要的所有参数都通过显示参数提供。
  • 方法只需要访问类的静态字段。

静态方法的常见用途——工厂方法

类似NumberFormat的类使用静态工厂方法来构造对象。NumberFormat类如下生成不同风格的格式化对象:

NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
NumberFormat percentFormatter = NumberFormat.getPercentInstance();
double x = 0.1;
System.out.println(currencyFormatter.format(x)); // prints $0.10
System.out.println(percentFormatter.format(x)); // prints 10%

NumberFormat类不利用构造器完成这些操作的主要原因:

  • 无法命名构造器。构造器的名字必须与类名相同。但是,这里希望有两个不同的名字,分别得到货币实例和百分比实例。
  • 使用构造器时,无法改变所构造对象的类型。而工厂方法实际上将返回DecimalFormat类的对象,这是NumberFormat的一个子类。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值