理论教育 static修饰符的使用-Java面向对象程序设计

static修饰符的使用-Java面向对象程序设计

时间:2023-11-25 理论教育 版权反馈
【摘要】:static 修饰符可以用来修饰类的成员变量、成员方法和代码块。用static 修饰的成员变量表示静态变量,可以直接通过类名来访问。用static 修饰的程序代码块表示静态代码块,当Java 虚拟机加载类时,就会执行该代码块。以下方法是非法的定义:static 和abstract 永远不能在一起使用。

static修饰符的使用-Java面向对象程序设计

static 修饰符可以用来修饰类的成员变量、成员方法和代码块。

➢ 用static 修饰的成员变量表示静态变量,可以直接通过类名来访问。

➢ 用static 修饰的成员方法表示静态方法,可以直接通过类名来访问。

➢ 用static 修饰的程序代码块表示静态代码块,当Java 虚拟机加载类时,就会执行该代码块。

被static 所修饰的成员变量和成员方法归某个类所有,它不依赖于类的特定实例,被类的所有实例共享。只要这个类被加载,Java 虚拟机就能根据类名在运行时数据区的方法区内定位到它们。

1.static 变量

类的成员变量有两种:一种是没有被static 修饰的变量,叫实例变量;一种是被static修饰的变量,叫类变量或者静态变量。

静态变量和实例变量的区别如下:

➢ 静态变量在内存中只有一个拷贝,运行时Java 虚拟机只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存分配。可以直接通过类名访问静态变量。

➢ 对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响。

在类的内部,可以在任何方法内直接访问静态变量。在其他类中,可以通过某个类的类名来访问它的静态变量。例如:

static 变量在某种程度上与其他语言(如C 语言)中的全局变量相似。Java 语言不支持不属于任何类的全局变量,静态变量提供了这一功能。它的作用如下:

➢ 能被类的所有实例共享,可作为实例之间进行交流的共享数据。

➢ 如果类的所有实例都包含一个相同的常量属性,可把这个属性定义为静态常量类型,从而节省内存空间。

2.static 方法

成员方法分为静态方法和实例方法。用static 修饰的方法叫作静态方法,或者类方法。静态方法和静态变量一样,不需要创建类的实例,可以直接通过类名来访问。例如:

因为静态方法不需要通过它所属的类的任何实例就会被调用,因此在静态方法中不能使用this 关键字,也不能直接访问所属类的实例变量和实例方法,但是可以直接访问所属类的静态变量和静态方法,如例4.12 所示。(www.daowen.com)

例4.12:

以上程序运行结果如下:

在静态方法内不允许访问非静态变量和方法,不能出现this 和supper 关键字。

静态方法必须被实现。静态方法用来表示某个类所特有的功能,这种功能的实现不依赖于类的具体实例,也不依赖于它的子类。既然如此,当前类必须为静态方法提供实现,即一个静态的方法不能被定义为抽象方法。以下方法是非法的定义:

static 和abstract 永远不能在一起使用。如果一个方法是静态的,它就必须自己实现该方法;如果一个方法是抽象的,那么它就只表示类所具有的功能,但不会去实现它,在子类中才会去实现它。

如作为程序入口的main()方法是静态方法,因为把main()方法定义为静态方法,可以使得Java 虚拟机只要加载了main 方法所属的类,就能执行main()方法,而无须创建这个类的实例。在main()方法中不能直接访问实例变量和实例方法。以下代码是非法的:

static(静态的)用来修饰成员、方法和内部类。当它修饰方法时,表示这个方法的运行不需要依赖于类的实例;当它修饰成员时,表示这个成员独立于类的任何一个实例之外;当它修饰内部类时,表示这个内部类的实例化不需要依赖于其外部类的实例(反之,如果一个内部类没有static 修饰符,就表示它的对象必须在其外部类的实例中才能创建)。综上所述,需要注意以下几点:

➢ 非静态的内部类不能包含静态的方法和成员。

➢ 静态的内部类可以用final 或abstract 修饰,但两者不可以同时用。

➢ 静态方法不会被继承,所以不可以是抽象的。

3.static 代码块

类中可以包含静态代码块,它不存在于任何方法体中。在Java 虚拟机加载类时会执行这些静态代码块。如果类中包含多个静态块,那么Java 虚拟机将按照它们在类中出现的顺序依次执行它,并且每个代码块只会被执行一次。

如例4.13 中,StaticBlock 类中包含两个静态代码块,运行StaticBlock 类的main()方法时,Java 虚拟机首先加载StaticBlock 类,在加载的过程中依次执行两个静态代码块。Java 虚拟机加载StaticBlock 后,再执行main()方法。

例4.13:

以上程序运行结果如下:

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

我要反馈