快捷搜索:

Java编程那些事儿65——static修饰符

8.7 修饰符

修饰符的感化是让被修饰的内容具备特定的功能,在法度榜样中合理应用修饰符可以在语法和功能上实现很多必要的效果。Java说话中的修饰符主要有5个:static、final、native、abstract和synchronized.这里首先解说static、final和native的感化。

8.7.1 static修饰符

static关键字的中辞意思是静态的,该修饰符可以修饰成员变量,成员常量和成员措施。应用该关键字修饰的内容,在面向工具中static修饰的内容是附属于类,而不是直接附属于工具的,以是static修饰的成员变量一样平常称作类变量,而static修饰的措施一样平常称作类措施。别的,static还可以修饰代码块,下面进行具体的先容。

8.7.1.1 静态变量

static修饰的变量称作静态变量。静态变量和一样平常的成员变量不合,一个类在加载到内存时,静态变量只初始化一次,也便是说所有工具的静态变量在内存中都只有一个存储位置,每个工具中的静态变量都指向内存中同一个地址,它是在所有的工具之间共享的数据。别的静态变量在引用时对照方便。以是一样平常在必要实现以下两个功能时应用静态变量:

l在工具之间共享值时

l方便造访变量时

下面首先说一下非静态变量(没有static修饰符修饰的成员变量)在内存中若何存储的。示例代码如下:

//文件名Box.java

public class Box{

int length;

int width;

int height;

public Box(int l,int w,int h){

length = l;

width = w;

height = h;

}

}

//文件名TestBox.java

public class TestBox{

public static void main(String[] args){

Box a = new Box(10,20,30);

Box b = new Box(40,20,10);

}

}

则工具a和工具b在内存中的存储款式如下图所示:

从上面的图可以看出,非静态变量的值在每个工具中都有自力的存储空间,不合工具间这些值之间没有治理,也便是说每个工具都为内部的每个非静态的变量分配自力的存储空间,以是每个工具中非静态变量是附属于工具,也便是说在每个工具中可能是不合的。

简单先容了非静态变量在工具中的存储今后,下面再来看一下静态变量是若何进行存储的。示例代码如下:

//文件名StaticVar.java

public class StaticDemo{

static int m;

int n;

char c;

}

//文件名TestStaticVar.java

public class TestStaticVar{

public static void main(String[] args){

StaticVar sv1 = new StaticVar();

StaticVar sv2 = new StaticVar();

}

}

则工具sv1和工具sv2在内存中存储的款式如下图所示:

对付StaticDemo类型的工具sv1和sv2来说,因为应用默认的构造措施进行构造,以是每个成员变量都被初始化为对应数据类型的默认值,int的默认值为0,char的默认值为编号为0的字符,以是sv1和sv2工具中存储的值如上图所示。

而静态变量的存储和非静态变量的存储不合,在Java虚拟机内部,第一次应用类时初始化该类中的所有静态变量,今后就不再进行初始化,而且无论创建若干个该类的工具,静态变量的存储在内存中都是自力于工具的,也便是Java虚拟机零丁为静态变量分配存储空间,以是导致所有的工具内部的静态变量在内存中存储时只有一个空间。这样就导致应用任何一个工具对该值的改动都是使该存储空间中的值发生改变,而其它工具在后续引用时就随着发生了变更。静态变量便是应用这样的要领在所有的工具之间进行数值共享的。

静态变量在实际应用时,可以经由过程只存储一次来节约存储空间,这个特点导致在类内部定义的成员常量一样平常都做成静态的,由于常量的值在每个工具中都是相同的,而且应用static修饰也便于对成员常量的引用。

在类外部造访某类中静态变量(常量)的语法款式为:

类名.成员变量(常量)

例如:

StaticDemo.m

这样方便对付成员变量的造访。当然,语法上也不禁止应用:工具。成员变量,这样的语法款式进行造访,然则一样平常不保举这样应用,而且有些类是无法创建工具的。

留意:static关键字不能修饰成员措施或构造措施内部的变量。

8.7.1.2 静态措施

static修饰的措施称作静态措施。静态措施和一样平常的成员措施比拟,不合的地方有两个:一是调用起来对照方便,二是静态措施内部只能应用静态的成员变量。以是一样平常静态措施都是类内部的自力的功能措施。例如为了方便措施的调用,Java API中的Math类中所有的措施都是静态的,而一样平常类内部的static措施也是方便其它类对该措施的调用。

示例代码如下:

//文件名MyMath.java

public class MyMath{

public static int max(int a,int b){

return (a > b ? a : b);

}

}

//文件名TestMyMath.java

public class TestMyMath{

public static void main(String[] args){

int m = 10;

int n = 20;

int k = MyMath.max(m,n);

}

}

静态措施在类的外部进行调用时不必要创建工具,应用类名。措施名(参数)这样的语法款式进行调研,简化了代码的编写。

应用静态措施时,必要分外留意的是静态措施内部应用该类的非静态成员变量,否则将呈现语法差错。

静态措施是类内部的一类特殊措施,只有在必要时才将对应的措施声明成静态的,一个类内部的措施一样平常都长短静态的。

8.7.1.3 静态代码块

静态代码块指位于类声明的内部,措施和构造措施的外部,应用static修饰的代码块。静态代码块在该类第一次被应用时履行一次,今后再也不履行。在实际的代码中,假如必要对类进行初始化的代码,可以写在静态代码块的内部。

示例代码如下:

//文件名StaticBlock.java

public class StaticBlock{

static{

System.out.println(“静态代码块!”);

}

}

静态代码块是一种特殊的语法,认识该语法的特征,在实际法度榜样中根据必要应用。

您可能还会对下面的文章感兴趣: