首页 理论教育 Java程序设计中的static关键字用法说明

Java程序设计中的static关键字用法说明

时间:2023-11-01 理论教育 版权反馈
【摘要】:被static修饰的成员具备一些特殊性。比如,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去访问。不建议通过对象名访问静态成员,例如程序第9行,不建议用c1.getInstancesCount()来替代My Circle3.getInstancesCount()。在类中,使用static关键字修饰的代码块被称为静态代码块。静态代码块必须位于类内,不属于任何成员方法,语法格式如下:静态代码块有static修饰,也是随着类的加载而执行,而且只执行一次。

Java程序设计中的static关键字用法说明

Java中的static关键字,可以用来修饰类的成员,如成员变量、成员方法以及代码块等。被static修饰的成员具备一些特殊性。比如,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去访问。

1.静态变量

被static修饰的成员变量称为静态变量或类变量,其不属于某一个类的具体对象,而是被该类的所有实例所共享,存放在内存中方法区的静态区。可见,如果一个成员变量被类的所有实例所共享,那么这个成员变量就应该被声明为静态的。通常通过“类名.静态变量”来访问静态变量。

静态变量和非静态变量(实例变量)的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化;而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

2.静态方法

被static修饰的方法称为静态方法或者类方法。可以在没有创建任何对象的前提下,仅仅通过类本身来调用静态方法。由于这个特性,通常通过“类名.静态方法”来访问静态方法。静态方法有以下几点注意事项:

(1)静态方法中不能使用this引用,静态方法可以在无实例的情况下被调用,此时如果方法中有this,则指向的对象可能根本不存在。

(2)在静态方法中不能直接访问类的非静态成员,包括实例变量和实例方法,反过来是可以的,实例方法可以直接访问静态成员。

(3)静态方法只能直接访问用static修饰的成员(静态成员),静态方法如果需要访问无static修饰的成员(非静态成员),就只能在静态方法中重新构造一个该类的对象。

注意:

关于访问静态成员,如果有了实例化对象,也可以通过“对象名.静态变量”和“对象名.静态方法”的方式访问静态成员,因为静态成员被所有对象所共享。但是并不推荐,因为这样无法体现变量或方法的静态特征。

【例3-6】

定义一个包含静态变量、静态方法、实例变量、实例方法的类,并通过测试类演示如何访问它们。

下面定义一个My Circle3类,类的成员如图3-13所示。

图3-13 MyCircle3类的定义(www.xing528.com)

说明:在MyCircle3类的成员变量中,类变量PI被final修饰,就是通常说的常量;类变量instancesCount用于统计该类创建的实例对象个数;实例变量radius是在每一个实例中都会分配空间的。在类MyCircle3的成员方法中,除了构造方法外,还有两个实例方法get Area()方法和getCircumference()方法,而方法getInstancesCount()是静态方法或称为类方法。

下面通过MyCircle3Test测试类来演示如何访问MyCircle3类的静态变量、静态方法、实例变量和实例方法,如图3-14所示。

图3-14 访问MyCircle3类的成员

说明:

(1)实例变量和实例方法都属于实例(或对象),只有在对象创建之后才能访问。而静态变量和静态方法归属于类,一旦类加载了就能通过类名访问。

(2)Java中,编译器会把含有main方法的类作为项目入口类。先加载main方法所在的类,然后执行main方法。而main方法是静态方法,是不需要实例化就可以直接执行的。

(3)不建议通过对象名访问静态成员,例如程序第9行,不建议用c1.getInstancesCount()来替代My Circle3.getInstancesCount()。

3.静态代码块

最后了解下静态代码块。在类中,使用static关键字修饰的代码块被称为静态代码块。静态代码块必须位于类内,不属于任何成员方法,语法格式如下:

静态代码块有static修饰,也是随着类的加载而执行,而且只执行一次。如果一个类中定义了多个静态代码块,则加载时按顺序依次执行。一般情况下,如果有些代码必须在项目启动的时候就执行,那么就需要使用静态代码块。静态代码块通常用来对类变量进行初始化。

与静态代码块对应的是非静态代码块,也称为构造代码块。构造代码块也必须位于类内,成员方法之外。构造代码块的语法格式为:

构造代码块的作用是给对象进行统一的初始化,每创建一个对象就调用一次,是给对象进行通用性的初始化。Java编译器编译后,构造代码块的语句体会被移动到构造方法(的最前端)中执行,构造方法中的语句体在构造代码块的语句体执行完毕后再执行,即构造代码块的代码优先于构造方法中的代码执行。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈