JAVA非访问修饰符

非访问修饰符

为了实现一些其他的功能,Java还提供了许多非访问修饰符,有static 、final、abstract、synchronized、volatile等。

static

static 修饰符,用来修饰类方法和类变量。

static修饰变量

static修饰变量,将该变量独立于对象,形成静态变量,也称类变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。
注:局部变量不能被声明为 static 变量。

static修饰方法

static修饰方法,将方法独立于对象,形成静态方法,静态方法不能使用类的非静态变量。
对类变量和方法的访问可以直接使用 classname.variablename 和 classname.methodname 的方式访问。

final

final具有“最后的”这含义。

final修饰变量

用final修饰变量,表示该变量一旦被赋值后,不能被重新赋值,即将该变量固定下来。被final修饰的实例变量必须显式指定初始值。
final 修饰符通常和 static 修饰符一起使用来创建类常量。

final修饰方法

声明 final 方法的主要目的是防止该方法的内容被修改。父类中的final方法可以被子类继承,但不能被子类重写。

final修饰类

final 类不能被继承,没有类能够继承 final 类的任何特性。

abstract

abstract具有抽象的意思。

abstract修饰类

abstract修饰类,形成抽象类,抽象类不能实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。
一个类不能同时被 abstract 和 final 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。
抽象类可以包含抽象方法和非抽象方法。

abstract修饰方法

abstract修饰方法,形成抽象方法,抽象方法是一种没有任何实现的方法,该方法的的具体实现由子类提供。
抽象方法不能被声明成 final 和 static。
任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。
如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。
抽象方法的声明以分号结尾,例如:public abstract method();。

synchronized

在java代码中使用synchronized可是使用在代码块和方法中,根据Synchronized用的位置可以有这些使用场景:
Synchronized的使用场景
关于synchronized的详细用法可以参考下面博文:synchronized的详细使用

transient

序列化与反序列化

在讨论transient之前,有必要先搞清楚Java中序列化的含义;

Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输,一般当我们使用缓存cache(内存空间不够有可能会本地存储到硬盘)或远程调用rpc(网络传输)的时候,经常需要让我们的实体类实现Serializable接口,目的就是为了让其可序列化。

当然,序列化后的最终目的是为了反序列化,恢复成原先的Java对象,要不然序列化后干嘛呢,所以序列化后的字节序列都是可以恢复成Java对象的,这个过程就是反序列化。

transient

Java中transient关键字的作用,简单地说,就是让某些被修饰的成员属性变量不被序列化,这一看好像很好理解,就是不被序列化,那么什么情况下,一个对象的某些字段不需要被序列化呢?如果有如下情况,可以考虑使用关键字transient修饰:

1、类中的字段值可以根据其它字段推导出来,如一个长方形类有三个属性:长度、宽度、面积(示例而已,一般不会这样设计),那么在序列化的时候,面积这个属性就没必要被序列化了;

2、其它,看具体业务需求吧,哪些字段不想被序列化;

volatile

volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。一个 volatile 对象引用可能是 null。
举个栗子说明一下吧!

public class MyClass implements Runnableprivate volatile boolean active;
	public void run(){
		active=true;
		while(active){
			System.out.println("doing");
		}
	}
	public void stop(){
		active=false;
	}

在这里,我们在线程一调用MyClass的对象.run(),控制台将始终输出“doing”,直到我们在线程二调用stop,将active变为false,run中的while循环不满足条件,结束循环。
如果active没有volatile修饰,在线程二我们调用stop时,active在共享内存中的值并不会立即改变,仍然输出“doing”。也就是说,volatile将强制更新值到共享内存中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值