ad

阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_4.4.2 静态常量

admin 73 2023-10-25

【摘要】 本书摘自《Java核心技术》一书中第4章,第4节,作者是来自美国的凯·S.霍斯特曼(Cay S.Horstmann),由林琪、苏钰涵等译。

4.4.2 静态常量

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

public static final double PI= 3.14159265358979323846;

在程序中,可以用Math.PI来访问这个常量。

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

阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_4.4.2 静态常量

你已经多次使用的另一个静态常量是System.out。它在System类中声明如下: public class Systen

public static final PrintStream out =...;

前面曾经多次提到过,由于每个类对象都可以修改公共字段,所以,最好不要有公共字 段。然而,公共常量(即final字段)却没问题。因为out被声明为 final,所以,不允许再将 它重新赋值为另一个打印流:

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

4.4.3 静态方法

静态方法是不在对象上执行的方法。例如, Math类的pow方法就是一个静态方法。表 达式

Math.pow(x,a)

会计算幂x。 在完成运算时,它并不使用任何Math对象。换句话说,它没有隐式参数。

可以认为静态方法是没有 this参数的方法(在一个非静态的方法中, this参数指示这个 方法的隐式参数,参见4.3.7节)。

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

public static int getNextId()

[

return nextId;// returns static field

}

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

int n = Employee.getNextId();

这个方法可以省略关键字 static吗?答案是肯定的。但是,这样一来,你就需要通过 Employee类对象的引用来调用这个方法。

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

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

● 方法只需要访问类的静态字段(例如: Employee.getNextId)。

4.4.4 工厂方法

静态方法还有另外一种常见的用途。类似 LocalDate 和 NumberFormat 的类使用静态工厂方法 (factory method)来构造对象。你已经见过工厂方法 LocalDate.now 和 LocalDate,of。NumberFormat 类如下生成不同风格的格式化对象:

NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();

NumberFormat percentFormatter = NumberFormat.getPercentInstance();

double x =0. 1;

System.out.println(currencyFormatter.format(x));// System.out.println(percentFormatter.format(x));//

prints

prints

$0.10

10%

为什么NumberFormat类不利用构造器完成这些操作呢?这主要有两个原因:

● 无法命名构造器。构造器的名字必须与类名相同。但是,这里希望有两个不同的名 字,分别得到货币实例和百分比实例。

● 使用构造器时,无法改变所构造对象的类型。而工厂方法实际上将返回 DecimalFormat 类的对象,这是NumberFormat 的一个子类(有关继承的更多详细内容请参看第5章)。

4.4.5 main 方法

需要注意,可以调用静态方法而不需要任何对象。例如,不需要构造Math类的任何对象 就可以调用Math.pow。

同理, main方法也是一个静态方法。

public class Application

public static void main(String[] args)

{

// Construct objects here

}

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 [email protected] 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_3.5.7 关系和 boolean 运算符
下一篇:阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_3.3.1 整型
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×