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在内存中的存储格式如下图所示:
对象a 对象b
<group id="_x0000_s1026" style="margin-top: 8.1pt; z-index: 251655680; left: 0px; margin-left: 20.45pt; width: 89.55pt; position: absolute; height: 65.8pt; text-align: left;" coordsize="1791,1316" coordorigin="2209,1794"><rect id="_x0000_s1027" style="left: 2209px; width: 768px; position: absolute; top: 1811px; height: 433px;"><textbox style=""></textbox></rect></group>
<textbox style=""><table width="100%" cellpadding="0" cellspacing="0"><tbody><tr><td style="border: medium none rgb(212, 208, 200); background-color: transparent;">
<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span lang="EN-US"><font size="3" color="#000000" face="Calibri">20</font></span></p>
</div>
</td></tr></tbody></table></textbox><textbox style=""><table width="100%" cellpadding="0" cellspacing="0"><tbody><tr><td style="border: medium none rgb(212, 208, 200); background-color: transparent;">
<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span lang="EN-US"><font size="3" color="#000000" face="Calibri">30</font></span></p>
</div>
</td></tr></tbody></table></textbox><shapetype id="_x0000_t202" coordsize="21600,21600" path="m,l,21600r21600,l21600,xe" o:spt="202"><stroke joinstyle="miter"></stroke><path o:connecttype="rect" gradientshapeok="t"></path></shapetype><shape id="_x0000_s1030" style="left: 3051px; width: 942px; position: absolute; top: 1794px; height: 444px;" stroked="f" type="#_x0000_t202"><textbox style=""><table width="100%" cellpadding="0" cellspacing="0"><tbody><tr><td style="border: medium none rgb(212, 208, 200); background-color: transparent;">
<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" color="#000000" face="Calibri">length</font></span></p>
</div>
</td></tr></tbody></table></textbox></shape><shape id="_x0000_s1031" style="left: 3055px; width: 942px; position: absolute; top: 2244px; height: 444px;" stroked="f" type="#_x0000_t202"><textbox style=""><table width="100%" cellpadding="0" cellspacing="0"><tbody><tr><td style="border: medium none rgb(212, 208, 200); background-color: transparent;">
<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" color="#000000" face="Calibri">width</font></span></p>
</div>
</td></tr></tbody></table></textbox></shape><shape id="_x0000_s1032" style="left: 3058px; width: 942px; position: absolute; top: 2654px; height: 444px;" stroked="f" type="#_x0000_t202"><textbox style=""><table width="100%" cellpadding="0" cellspacing="0"><tbody><tr><td style="border: medium none rgb(212, 208, 200); background-color: transparent;">
<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" color="#000000" face="Calibri">height</font></span></p>
</div>
</td></tr></tbody></table></textbox></shape><group id="_x0000_s1033" style="margin-top: 8.05pt; z-index: 251656704; left: 0px; margin-left: 230.35pt; width: 89.55pt; position: absolute; height: 65.8pt; text-align: left;" coordsize="1791,1316" coordorigin="2209,1794"><rect id="_x0000_s1034" style="left: 2209px; width: 768px; position: absolute; top: 1811px; height: 433px;"><textbox style=""><table width="100%" cellpadding="0" cellspacing="0"><tbody><tr><td style="border: medium none rgb(212, 208, 200); background-color: transparent;">
<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span lang="EN-US"><font size="3" color="#000000" face="Calibri">40</font></span></p>
</div>
</td></tr></tbody></table></textbox></rect><rect id="_x0000_s1035" style="left: 2209px; width: 768px; position: absolute; top: 2244px; height: 433px;"><textbox style=""><table width="100%" cellpadding="0" cellspacing="0"><tbody><tr><td style="border: medium none rgb(212, 208, 200); background-color: transparent;">
<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span lang="EN-US"><font size="3" color="#000000" face="Calibri">20</font></span></p>
</div>
</td></tr></tbody></table></textbox></rect><rect id="_x0000_s1036" style="left: 2209px; width: 768px; position: absolute; top: 2677px; height: 433px;"><textbox style=""><table width="100%" cellpadding="0" cellspacing="0"><tbody><tr><td style="border: medium none rgb(212, 208, 200); background-color: transparent;">
<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span lang="EN-US"><font size="3" color="#000000" face="Calibri">10</font></span></p>
</div>
</td></tr></tbody></table></textbox></rect><shape id="_x0000_s1037" style="left: 3051px; width: 942px; position: absolute; top: 1794px; height: 444px;" stroked="f" type="#_x0000_t202"><textbox style=""><table width="100%" cellpadding="0" cellspacing="0"><tbody><tr><td style="border: medium none rgb(212, 208, 200); background-color: transparent;">
<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" color="#000000" face="Calibri">length</font></span></p>
</div>
</td></tr></tbody></table></textbox></shape><shape id="_x0000_s1038" style="left: 3055px; width: 942px; position: absolute; top: 2244px; height: 444px;" stroked="f" type="#_x0000_t202"><textbox style=""><table width="100%" cellpadding="0" cellspacing="0"><tbody><tr><td style="border: medium none rgb(212, 208, 200); background-color: transparent;">
<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" color="#000000" face="Calibri">width</font></span></p>
</div>
</td></tr></tbody></table></textbox></shape><shape id="_x0000_s1039" style="left: 3058px; width: 942px; position: absolute; top: 2654px; height: 444px;" stroked="f" type="#_x0000_t202"><textbox style=""><table width="100%" cellpadding="0" cellspacing="0"><tbody><tr><td style="border: medium none rgb(212, 208, 200); background-color: transparent;">
<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" color="#000000" face="Calibri">height</font></span></p>
</div>
</td></tr></tbody></table></textbox></shape></group>
从上面的图可以看出,非静态变量的值在每个对象中都有独立的存储空间,不同对象间这些值之间没有管理,也就是说每个对象都为内部的每个非静态的变量分配独立的存储空间,所以每个对象中非静态变量是隶属于对象,也就是说在每个对象中可能是不同的。
简单介绍了非静态变量在对象中的存储以后,下面再来看一下静态变量是如何进行存储的。示例代码如下:
//文件名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在内存中存储的格式如下图所示:
对象sv1 对象sv2
<group id="_x0000_s1050" style="margin-top: 12.1pt; z-index: 251659776; left: 0px; margin-left: 133.5pt; width: 63.95pt; position: absolute; height: 22.8pt; text-align: left;" coordsize="1279,456" coordorigin="4470,9674"><rect id="_x0000_s1051" style="left: 4470px; width: 641px; position: absolute; top: 9700px; height: 430px;"><textbox style=""></textbox></rect></group>
<shape id="_x0000_s1052" style="left: 5177px; width: 572px; position: absolute; top: 9674px; height: 444px;" stroked="f" type="#_x0000_t202"><textbox style=""><table width="100%" cellpadding="0" cellspacing="0"><tbody><tr><td style="border: medium none rgb(212, 208, 200); background-color: transparent;">
<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" color="#000000" face="Calibri">m</font></span></p>
</div>
</td></tr></tbody></table></textbox></shape><group id="_x0000_s1045" style="margin-top: 4.9pt; z-index: 251658752; left: 0px; margin-left: 238pt; width: 63.6pt; position: absolute; height: 43pt; text-align: left;" coordsize="1272,860" coordorigin="6560,9530"><rect id="_x0000_s1046" style="left: 6560px; width: 641px; position: absolute; top: 9530px; height: 430px;"><textbox style=""><table width="100%" cellpadding="0" cellspacing="0"><tbody><tr><td style="border: medium none rgb(212, 208, 200); background-color: transparent;">
<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span lang="EN-US"><font size="3" color="#000000" face="Calibri">0</font></span></p>
</div>
</td></tr></tbody></table></textbox></rect><shape id="_x0000_s1047" style="left: 7311px; width: 483px; position: absolute; top: 9530px; height: 444px;" stroked="f" type="#_x0000_t202"><textbox style=""><table width="100%" cellpadding="0" cellspacing="0"><tbody><tr><td style="border: medium none rgb(212, 208, 200); background-color: transparent;">
<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" color="#000000" face="Calibri">n</font></span></p>
</div>
</td></tr></tbody></table></textbox></shape><rect id="_x0000_s1048" style="left: 6560px; width: 641px; position: absolute; top: 9960px; height: 430px;"><textbox style=""><table width="100%" cellpadding="0" cellspacing="0"><tbody><tr><td style="border: medium none rgb(212, 208, 200); background-color: transparent;">
<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span lang="EN-US"><font size="3" color="#000000" face="Calibri">0</font></span></p>
</div>
</td></tr></tbody></table></textbox></rect><shape id="_x0000_s1049" style="left: 7319px; width: 513px; position: absolute; top: 9941px; height: 444px;" stroked="f" type="#_x0000_t202"><textbox style=""><table width="100%" cellpadding="0" cellspacing="0"><tbody><tr><td style="border: medium none rgb(212, 208, 200); background-color: transparent;">
<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" color="#000000" face="Calibri">c</font></span></p>
</div>
</td></tr></tbody></table></textbox></shape></group><group id="_x0000_s1040" style="margin-top: 1.5pt; z-index: 251657728; left: 0px; margin-left: 41pt; width: 63.25pt; position: absolute; height: 43pt; text-align: left;" coordsize="1265,860" coordorigin="2620,9462"><rect id="_x0000_s1041" style="left: 2620px; width: 641px; position: absolute; top: 9462px; height: 430px;"><textbox><table width="100%" cellpadding="0" cellspacing="0"><tbody><tr><td style="border: medium none rgb(212, 208, 200); background-color: transparent;">
<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span lang="EN-US"><font size="3" color="#000000" face="Calibri">0</font></span></p>
</div>
</td></tr></tbody></table></textbox></rect><shape id="_x0000_s1042" style="left: 3368px; width: 483px; position: absolute; top: 9462px; height: 444px;" stroked="f" type="#_x0000_t202"><textbox style=""><table width="100%" cellpadding="0" cellspacing="0"><tbody><tr><td style="border: medium none rgb(212, 208, 200); background-color: transparent;">
<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" color="#000000" face="Calibri">n</font></span></p>
</div>
</td></tr></tbody></table></textbox></shape><rect id="_x0000_s1043" style="left: 2620px; width: 641px; position: absolute; top: 9892px; height: 430px;"><textbox><table width="100%" cellpadding="0" cellspacing="0"><tbody><tr><td style="border: medium none rgb(212, 208, 200); background-color: transparent;">
<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span lang="EN-US"><font size="3" color="#000000" face="Calibri">0</font></span></p>
</div>
</td></tr></tbody></table></textbox></rect><shape id="_x0000_s1044" style="left: 3372px; width: 513px; position: absolute; top: 9866px; height: 444px;" stroked="f" type="#_x0000_t202"><textbox style=""><table width="100%" cellpadding="0" cellspacing="0"><tbody><tr><td style="border: medium none rgb(212, 208, 200); background-color: transparent;">
<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" color="#000000" face="Calibri">c</font></span></p>
</div>
</td></tr></tbody></table></textbox></shape></group>
对于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(“静态代码块!”);
}
}
静态代码块是一种特殊的语法,熟悉该语法的特点,在实际程序中根据需要使用。
分享到:
相关推荐
Java static修饰方法。例子仅供参考。
也是通过查阅网上资料,初略的整理了一下,(包含了final、static、abstract和访问修饰符public、protect、default、private)写成规范文档希望对有需要的提供些帮助
马士兵面向对象this——static
主要介绍了Java编程中protected关键字与static关键字的作用,是Java入门学习中的基础知识,需要的朋友可以参考下
java代码-使用java解决static修饰方法的源代码 ——学习参考资料:仅用于个人学习使用!
静态单元格示例——StaticCell.zip
Java SE编程入门教程 java static final(共24页).pptx Java SE编程入门教程 java this和super(共10页).pptx Java SE编程入门教程 java 常用API(共22页).pptx Java SE编程入门教程 javaGUI编程快速入门(1)(共...
11.第十一章——this和static——static作为成员变量易混大补充(重要!)+引用数据类型作成员变量的作业分析.pdf
先看下面的例子,它将告诉我们在JS世界中也有C#里的public , private ,及static等
java中的非访问修饰符的作用各不一样,据我所知常用的有六种: static final abstract synchronized volatile transient 今天我们只讲前三种,后面三种等我们讲到线程的时候再回过头来讲。 首先还是通过一张经典的表...
static:修饰符:修饰变量,函数。作用域:变量仅仅在本文件可见,函数在本文件可以被调用。static在函数内部定义的话,分配在堆中,数值保存在data段,而不是在栈中,而且只赋值一次。 extern:修饰符:修饰变量,...
Java 关键字修饰成员变量例子。
auto、register、static、extern等存储类修饰符的区别.
本文主要给大家介绍了关于c++中static修饰符的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 下面一段是引用自effective c++ 中的一句话: 所谓的static对象,其寿命是从构造出来到...
以下是对Java修饰符abstract,static,final的区别进行了详细的介绍,需要的朋友可以过来参考下
java static关键字详解(csdn)————程序
JAVA访问修饰符
文旦含有java编程思想一书中前9章的PPT 还附有几个基础型的编程代码 如乘法表: public class Chengfabiao { public static void main(String[] args) { for (int i = 1; i ; i++) {// 从1开始循环到9 for ...
java代码-日常练习32 静态修饰符 static 修饰:类 类的成员(变量及方法)
java练习题chp7 Key Point ●static ●final ●abstrac