首页 > 编程语言 >Java中 static/transient,final/volatile 说明

Java中 static/transient,final/volatile 说明

时间:2023-09-07 14:33:52浏览次数:53  
标签:Java 常量 int 对象 transient static final FIRST


你可以任意使用如下的修改限定关键字来定义一个字段:final或者volatile和/或者static和/或者transient。
如果你将一个字段定义为final,编译器将确保字段当成一个常量——只读变量来初始化和处理。因为编译器知道常量是不变的,所以在程序的字节码中对其进行了内部优化。


class Employee 
  

{ 
  

final int ACCOUNTANT = 1; 
  

final int PAYROLL_CLERK = 2; 
  

final int MANAGER = 3; 
  



int jobID = ACCOUNTANT; 
  

}


如果你将一个字段声明为volatile,则多线程将能访问此字段,而特定的编译器将防止最优化以使该字段能被适当的访问。



 



如果你将一个字段定义为static,则所有对象都将共享此字段的一份拷贝。当你将一个新值赋给这个字段时,所有对象都将得到这个新值。如果没有指定为static,则这个字段将是一个实例字段,每个对象都使用他们自己的一份拷贝。
定义为transient的字段值在对象串行化过程中将不被保存。



 



实例字段“实例字段”就是没有使用static修改标识符定义的字段。实例字段和对象紧密相连——而不是和类。当在一个对象代码里修改时,仅仅这个相关的类实例——对象——可以得到这个改变。实例字段随对象的创建而创建,随对象的释放而释放。



 



类字段类字段是用static关键字定义的字段。类字段和类联系——而不是对象。当在一个类代码中修改时,这个类(以及所有创建的对象)都能感知这个变化。类字段随类的加载而创建,随类的卸载而释放



 



常量“常量”是一种只读变量;当JVM初始化这种变量后,变量的值就不能改变了。
使用final关键字来定义常量。正如有两种字段——实例和类字段,常量也有两种——实例常量和类常量。为了提高效率,应当创建类常量,或者说是final static字段。



 

class Constants 
  

{ 
  

final int FIRST = 1; 
  

final static int SECOND = 2; 
  



public static void main(String[] args) 
  

{ 
  

int iteration = SECOND; 
  



if (iteration == FIRST)//编译错误 
  

System.out.println(“first iteration”); 
  

else 
  

if (iteration == SECOND) 
  

System.out.println(“second iteration”); 
  

} 
  

}



上例中的Constants类定义了一对常量——FIRST和SECOND。FIRST是实例常量,因为JVM给每个Constants对象分配一份FIRST的拷贝。相反的,因为JVM在加载Constants类后只创建了一份SECOND拷贝,所以SECOND是类常量。
注意:当你尝试在main()中直接访问FIRST时会导致一个编译错误。常量FIRST直到一个对象创建时才存在,所以FIRST仅仅只能被这个对象所访问——而不是类。

标签:Java,常量,int,对象,transient,static,final,FIRST
From: https://blog.51cto.com/u_2544485/7397001

相关文章

  • 从追MM谈Java的23种设计模式
    1、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory.以下是引用片段:实例一:publicclassFactory{......
  • 杰哥教你面试之一百问系列:java中高级多线程concurrent的使用
    目录问题1:什么是ConcurrentHashMap?它与HashMap的区别是什么?问题2:什么是CopyOnWriteArrayList?它适用于什么样的场景?问题3:什么是BlockingQueue?它的作用是什么?举例说明一个使用场景。问题4:什么是Semaphore?它如何控制并发访问?问题5:什么是CountDownLatch?它适用于什么场景?问题6:什么是Cyc......
  • java多线程几个方法的基本概念
    一、run()和start()这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用run()方法,这是由Java的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void.二、关键字Synchronized这个关键字用于保护共享数据,当然......
  • 无涯教程-JavaScript - BITAND函数
    描述BITAND函数返回两个数字的按位"AND"。语法BITAND(number1,number2)争论Argument描述Required/Optionalnumber1Mustbeindecimalformandgreaterthanorequalto0.Requirednumber2Mustbeindecimalformandgreaterthanorequalto0.Required......
  • Java的System.setProperty()和System.getProperty()
    写在前面:这里的System,系统指的是JRE(runtime)system,不是指OS。参数设置成为系统的全局变量,可以在项目的任何一个地方,通过System.getProperty("变量");来获得。System.setProperty相当于一个静态变量,存在内存里面!System.setProperty()/* *设置指定键对值的系统属性 *......
  • java内容偏多 一般有用 看1
                              ......
  • JavaNote03-流程控制语句
    0.流程控制语句流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。程序设计中规定的3种流程结构,即:顺序结构程序从上到下逐行地执行,中间没有任何判断和跳转。分支结构根据条件,选择性地执行某段代码。有if…else和switch-......
  • 无涯教程-JavaScript - BIN2DEC函数
    描述BIN2DEC函数将二进制数字转换为十进制。语法BIN2DEC(number)争论Argument描述Required/Optionalnumber您要转换的二进制数。Numbercannotcontainmorethan10characters(10bits).数字的最高有效位是符号位。其余的9位是幅度位。负数使用二进制补码表示......
  • a href=#与 a href=javascript:void(0)的区别?
    一个<a>链接的按钮可在该窗口上弹出一个div悬浮层。但是每次点击,div悬浮层就自动位于IE窗口的顶端,下面的iframe窗口包含的页面会自动上移,位置错乱了。href='#'οnclick='click事件名()'></a>这里的href='#'的原因,把它改成三个#就没问题了,即修改为<ahref='###'     嘿,还真好......
  • Javascript 中对HTML编码和解码的方法
    String.prototype.HTMLEncode=function(){vartemp=document.createElement("div");(temp.textContent!=null)?(temp.textContent=this):(temp.innerText=this);varoutput=temp.innerHTML;temp=null;returnoutput;}String.prot......